圆划分平面


23

任务

您将在平面中得到一组圆,其圆心在y = 0上。保证没有一对圆具有多个公共点。

您的任务是确定圆将平面划分为多少个区域。区域是不包含任何圆的最大包含点连续点集。

给定圆的描述后,您应该编写一个程序来计算此答案。


这是一个例子:

例子1

在左侧,您会看到在平面上绘制的圆。但是,在图片的右半部分,圆圈所产生的区域会明显地着色(每个区域一种颜色)。此示例中有六个区域。


输入项

输入的第一行包含一个数字,N后跟的圆圈描述数。这行是可选的,如果您的解决方案在没有它的情况下也可以,那么就可以了。

以下N各行分别包含两个整数x ir i > 0,代表一个以中心(x i,0)和半径r i为中心的圆。

保证没有一对圆具有多个公共点。进一步保证x ir i的10^9绝对值不超过(因此,它们可以舒适地装入32位整数)。


输入可以是:

  • 从STDIN读取

  • I当前目录中命名的文件中读取

或者,输入可以是:

  • 在全局变量中作为字符串(包括换行符)可用

  • 在堆栈上


输出量

这应该是一个整数,即要生成的区域数。应该将其写入STDOUT或O当前目录中命名的文件。


规则

  • 以字节为单位的最短代码获胜

  • 如果您的代码没有运行时,则+200字节罚款+中的空间复杂度多项式 n

  • -100字节奖励,用于最坏情况下的预期运行时+空间复杂度 O(n log n)

  • -50字节奖励,用于最坏情况下的预期运行时+空间复杂度 O(n)

  • 确定性运行时+100字节加空间复杂度 O(n)

在评估运行时:

  • 假定哈希表具有O(1)预期的插入,删除和查找运行时间,而与操作顺序和输入数据无关。这可能是正确的,也可能不是正确的,具体取决于实现是否使用随机化。

  • 假设您的编程语言的内置类型花费确定性的O(n log n)时间,其中n输入序列的大小为。

  • 假设对输入数字的算术运算仅O(1)花费时间。

  • 尽管出于实际原因,不要假定输入数字受常数限制。这意味着诸如基数排序或计数排序之类的算法不是线性时间。通常,应避免很大的常数因子。


例子

输入:

2 
1 3
5 1

输出: 3


输入:

3
2 2
1 1
3 1

输出: 5

4
7 5
-9 11
11 9
0 20

输入:

9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2

输出: 11


提示

我们可以将以下想法用于非常紧凑的解决方案。让我们将一组圆与X轴相交,并将交点解释为平面图中的节点:

在此处输入图片说明

每个圆在此图中精确地产生2条边,最多产生2个节点。我们可以通过使用哈希表来计算节点数,以跟踪不同的左边界或右边界的总数。

然后,我们可以使用欧拉特征公式来计算图形的面数:

V - E + F - C = 1

F = E - V + C + 1

要计算C连接组件的数量,我们可以使用深度优先搜索


注意:这个问题的想法是从最近的克罗地亚编程竞赛中借来的,但是请不要通过查看解决方案概述来作弊。:)


这些奖金中有一些诱饵吗?
user2357112支持Monica 2014年

@ user2357112不要以为除非您能证明就不能完成;)
Niklas B.

好了,在保证输入适合机器整数的情况下,我们可以使用基数排序并将其称为O(n)。我讨厌假设输入大小受限制,因为严格来说,这意味着有可能有限的输入。
user2357112支持Monica 2014年

@ user2357112不,我说过在评估渐近性时不能假设整数是有界的,因此基数排序和计数排序都不是线性的时间和空间。它们适合一个单词只是为了使算术“真正”成为O(1),并且出于实际原因(在大多数语言中为可变宽度)
Niklas B.

@NiklasB。如果我有一种算法,其中具有超线性复杂度的唯一组件是排序,那么如果我的语言使用快速排序,就必须实现合并排序,以便获得n log n奖励?此外,我确实有新的概念上新的解决方案。我应该发布替换旧答案的新答案吗?(如果我的新解决方案实际上不正确,我希望使用前一种方法)
Martin Ender 2014年

Answers:


2

Mathematica,125122-150 = -28个字符

我不知道内置函数的复杂性ConnectedComponents

1+{-1,2,1}.Length/@{VertexList@#,EdgeList@#,ConnectedComponents@#}&@Graph[(+##)<->(#-#2)&@@@Rest@ImportString[#,"Table"]]&

用法:

1+{-1,2,1}.Length/@{VertexList@#,EdgeList@#,ConnectedComponents@#}&@Graph[(+##)<->(#-#2)&@@@Rest@ImportString[#,"Table"]]&[
"9
38 14
-60 40
73 19
0 100
98 2
-15 5
39 15
-38 62
94 2"]

11


我认为我们可以放心地假设它ConnectedComponents具有线性预期的最坏情况下的复杂度,因此,如果有O(n)个分量,那就可以了。我不了解Mathematica,所以我无法判断它总体上是否为O(n)并符合-150奖金的资格?我认为是的。我是否仅使用STDIN中的输入运行它?
Niklas B.

@NiklasB。他的输入法只是将字符串变量传递给匿名函数。所以我认为应该有资格。至于输出,在Mathematica中,这只会导致数字最终出现在控制台输出中,因此也应该没问题。
Martin Ender 2014年

我已经验证了此方法的正确性,因此我认为得分为-28的人是新领导者。恭喜你!
Niklas B.

@NiklasB。为什么只有150个?算法的哪一部分具有超线性最坏情况复杂度?
马丁·恩德2014年

@ m.buettner 150用于O(n)预期时间。对于像图这样隐式定义的具有任意数字作为节点的图,您只是找不到线性时间中的CC数,这可以通过减少与连接的组件的元素区别来显示。我认为我们也可以将元素的独特性降低到原始问题
Niklas B.

4

红宝石- 312 306 285 273 269 259个字符

这个答案已被我的另一种方法所取代,该方法使用的字符要少得多,并且在中运行O(n log n)

好吧走吧 对于初学者来说,我只是想要一个可行的实现,因此还没有对算法进行优化。我将圆圈从大到小排序,然后构建一棵树(其他圆圈中的圆圈是较大圆圈的子代)。两种操作都O(n^2)在最坏的情况下O(n log n)进行。然后,我遍历树以计数区域。如果一个圆的孩子填满了整个直径,则有两个新区域,否则只有一个。此迭代需要O(n)。因此,我具有整体复杂性O(n^2),没有资格获得奖励或惩罚。

这段代码希望将没有圈数的输入存储在变量中s

t=[]
s.lines.map{|x|x,r=x.split.map &:to_i;{d:2*r,l:x-r,c:[]}}.sort_by!{|c|-c[:d]}.map{|c|i=-1;n=t
while o=n[i+=1]
if 0>d=c[:l]-o[:l]
break
elsif o[:d]>d
n=o[:c]
i=-1
end
end
n[i,0]=c}
a=1
t.map &(b=->n{d=0
n[:c].each{|c|d+=c[:d]}.map &b
a+=d==n[:d]?2:1})
p a

非高尔夫版本(期望在变量中输入string):

list = []
string.split("\n").map { |x|
  m = x.split
  x,radius = m.map &:to_i
  list<<{x:x, d:2*radius, l:x-radius, r:x+radius, children:[]}
}
list.sort_by! { |circle| -circle[:d] }
tree = []
list.map { |circle|
  i = -1
  node = tree
  while c=node[i+=1]
    if circle[:x]<c[:l]
      break
    elsif circle[:x]<c[:r]
      node = c[:children]
      i = -1
    end
  end
  node[i,0] = circle
}
areas = 1
tree.map &(count = -> node {
  d = 0
  i = -1
  while c=node[:children][i+=1]
    count.call c
    d += c[:d]
  end
  areas += d == node[:d] ? 2 : 1
})
p areas

@NiklasB。是的,该测试用例会很好。定义我的树的边缘的关系只是将一个圆包含在另一个圆中。由于圆不能包含在两个彼此不包含的圆中(由于“一个相交”的条件),因此我看不到这可能是DAG。
Martin Ender 2014年

节点的孙子还是其子孙吗?
user2357112支持Monica 2014年

@ user2357112不,因为他们只能拆分其直接父母
Martin Ender

@NiklasB。如果我以您问题中的示例运行它,则会得到11。对于您的评论之一9
Martin Ender 2014年

@NiklasB。等待,我实际上得到108我ungolfed版本,但119我目前的golfed版本:d
马丁安德

2

红宝石,203 183 173 133 - 100 = 33个字符

所以这是一种不同的方法。这次,我按圆圈的最左点对其进行了排序。触摸最左点的圆按从大到小的顺序排序。这需要O(n log n)(嗯,Ruby使用快速排序,所以实际上,O(n^2)但是实现合并/堆排序可能超出了此挑战的范围)。然后,我遍历此列表,记住我访问过的圈子的所有最左和最右位置。这使我能够检测出一系列圆是否始终围绕一个封闭的较大圆连接在一起。在这种情况下,有两个子区域,否则只有一个。该迭代仅O(n)给出总复杂度即可O(n log n)获得100个字符的奖励。

此代码段期望通过命令行参数中的文件提供输入,但不包括圆圈数:

l,r={},{}
a=1
$<.map{|x|c,q=x.split.map &:to_r;[c-q,-2*q]}.sort.map{|x,y|a+=r[y=x-y]&&l[x]?2:1
l[y]=1 if l[x]&&!r[y]
l[x]=r[y]=1}
p a

非高尔夫版本(期望在变量中输入string):

list = []
string.split("\n").map { |x|
  m = x.split
  x,radius = m.map &:to_r
  list<<{x:x, d:2*radius, l:x-radius, r:x+radius}
}
list.sort_by! { |circle| circle[:l] + 1/circle[:d] }
l,r={},{}
areas = 1
list.map { |circle|
  x,y=circle[:l],circle[:r]
  if l[x] && r[y]
    areas += 2
  else
    areas += 1
    l[y]=1 if l[x]
  end
  r[y]=1
  l[x]=1
}
p areas

不幸的是,这对于所有较大的测试用例都失败了。虽然速度很快;)这次我没有一个失败的小例子,但是您可以在我链接到的竞赛网站上找到测试数据(竞赛#6)
Niklas B.

第一个失败的测试用例是kruznice / kruznice.in.2,这是第一个“真实”测试用例,因此我认为算法或实现都存在根本上的错误。它对任意嵌套的圆是否起作用?
Niklas B.

@NiklasB。谢谢,我将看一下测试用例(尽管可能要带我到明天晚上才能解决)
Martin Ender 2014年

@NiklasB。我发现了问题,最小的失败示例需要5个圆圈:-1 1 1 1 0 2 4 2 0 6。我会考虑如何在明天晚上之前解决此问题(希望如此)。
Martin Ender 2014年

您的复杂性分析似乎假设关联数组访问是恒定时间。在最坏的情况下,这似乎不太正确。
彼得·泰勒

1

朱莉娅-260 -100(奖金?)= 160

用顶点(相交),边和面(平面的面积)将圆解释为数字,我们可以使用Euler特征相互关联,因此我们只需要知道“顶点”和“边”的数量即可用下面的公式表示“面”或平面区域:欧拉特征

更新:经过一会儿思考,我发现我的方法的问题仅在于圆没有连接时,所以我有了一个主意,为什么不人为地连接它们呢?因此,整体将满足欧拉公式。

圆的例子

F = 2 + EV(V = 6,E = 9)

[不与嵌套圆一起使用,因此它不能解决一般情况下的问题]

代码

s=readlines(open("s"))
n=int(s[1])
c=zeros(n,2)
t=[]
for i=1:n
    a=int(split(s[i+1]))
    c[i,1]=a[1]-a[2]
    c[i,2]=a[1]+a[2]
    if i==1 t=[c[1]]end
    append!(t,[c[i,1]:.5:c[i,2]])
end
e=0
t=sort(t)
for i in 1:(length(t)-1) e+=t[i+1]-t[i]>=1?1:0end #adds one edge for every gap
2+2n+e-length(unique(c)) # 2+E-V = 2+(2n+e)-#vertices

我认为您的程序将失败2 -10 1 10 1
Niklas B.

“可以保证没有一对圆有一个以上的共同点。” 所以我认为这将不适用:)
CCP

@CCP它们的共同点为零。n=2,圆圈是(C=(-10,0), r=1)(C=(10,0), r=1)
尼克拉斯B.

1
图是否必须连接才能应用欧拉特性?
user2357112支持Monica 2014年

1
嗯,这是一个简单的案例:4 0 2 1 1 10 2 11 1但是我认为我不能给您更多的测试案例,这有点不公平
Niklas B.

1

的SpiderMonkey JS,308,287,273 - 100 = 173

我认为,如果我用Ruby或Python重写此代码,则可以保存字符。

码:

for(a=[d=readline],e={},u=d(n=1);u--;)[r,q]=d().split(' '),l=r-q,r-=-q,e[l]=e[l]||[0,0],e[r]=e[r]||[0,0],e[r][1]++,e[l][0]++
for(k=Object.keys(e).sort(function(a,b)b-a);i=k.pop();a.length&&a.pop()&a.push(0)){for([l,r]=e[i];r--;)n+=a.pop()
for(n+=l;l--;)a.push(l>0)}print(n)

算法:

n = 1 // this will be the total
e = {x:[numLeftBounds,numRightBounds]} // imagine this as the x axis with a count of zero-crossings
a = [] // this is the stack of circles around the "cursor".  
       // values will be 1 if that circle's never had alone time, else 0
k = sort keys of e on x
for each key in k: // this is the "cursor"
  n += key[numLeftBounds] // each circle that opens has at least one space.
  k[numRightBounds].times {n += a.pop()} // pop the closing circles. if any were never alone, add 1
  k[numLeftBounds].times {a.push(alwaysAlone)} // push the opening circles
  if !a.empty():
     set the innermost circle (top of stack) to false (not never alone)
  fi
loop

我并不是很擅长使用大的O表示法,但是我认为这是O(n),因为我可以有效地循环遍历每个圆圈3次(创建,左,右),并且还对地图的键进行排序(并且我对O( n log n),但消失了。这是确定性的吗?


如果有人对如何将r循环和l循环合并为一条语句有任何建议,我将不胜感激。
并非查尔斯(Charles)

干杯:)在我看来,由于排序,您的运行时确实为O(n log n),这将是-100。我会让您知道它是否通过了所有测试用例。
Niklas B. 2014年

很好,您的程序在第一次尝试时就通过了所有测试用例。我认为像这样的问题(带有一些状态的扫描线保持在堆栈中)是问题作者的官方解决方案。您的程序得到的总成绩为173
NiklasB。

@NiklasB。谢谢!
不是查尔斯(Charles)

我试图用重叠的圆来做一个更鲁棒的解决方案...。然后我看到它们只能在一点处相交。
不是查尔斯(Charles)

-1

的JavaScript(ES6) - 255个 254个字符- 100名 250奖金= 155 4

R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

假设输入字符串在变量中,S并将区域数输出到控制台。

R=/(\S+) (\S+)/ym;                  // Regular expression to find centre and width.
N=1;                                // Number of regions
w=l=0;                              // Maximum width and minimum left boundary.
X=[];                               // A 1-indexed array to contain the circles.
                                    // All the above are O(1)
for(;m=R.exec(S);){                 // For each circle
    X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};
                                    // Create an object with w (width), l (left boundary)
                                    // and r (right boundary) attributes.
    l=k<l?k:l;                      // Update the minimum left boundary.
    w=j<w?w:j                       // Update the maximum width.
}                                   // O(1) per iteration = O(N) total.
M=[];                               // An array.
X.map(x=>M[(x.l-l+1)*w-x.w]=x);     // Map the 1-indexed array of circles (X) to a
                                    // sparse array indexed so that the elements are
                                    // sorted by ascending left boundary then descending
                                    // width.
                                    // If there are N circles then only N elements are
                                    // created in the array and it can be treated as if it
                                    // is a hashmap (associative array) with a built in
                                    // ordering and as per the rules set in the question
                                    // is O(1) per insert so is O(N) total cost.
                                    // Since the array is sparse then it is still O(N)
                                    // total memory.
s=[];                               // An empty stack
i=0;                                // The number of circles on the stack.
M.map(x=>{                          // Loop through each circle
    while(i&&s[i-1][1]<x[1])        // Check to see if the current circle  is to the right
                                    // of the circles on the stack;
      N+=s[--i][0]?0:1;             // if so, decrement the length of the stack and if the
                                    // circle that pops off has radius equal to the total
                                    // radii of its children then increment the number of
                                    // regions by 1.

                                    // Since there can be at most N items on the stack then
                                    // there can be at most N items popped off the stack
                                    // over all the iterations; therefore this operation
                                    // has an O(N) total cost.
    i&&(s[i-1][0]-=x[0]);           // If there is a circle on the stack then this circle
                                    // is its child. Decrement the parent's radius by the
                                    // current child's radius.
                                    // O(1) per iteration
    s[i++]=x                        // Add the current circle to the stack.
  });
while(i)N+=s[--i][0]?0:1            // Finally, remove all the remaining circles from the
                                    // stack and if the circle that pops off has radius
                                    // equal to the total radii of its children then
                                    // increment the number of regions by 1.
                                    // Since there will always be at least one circle on the
                                    // stack then this has the added bonus of being the final
                                    // command so the value of N is printed to the console.
                                    // As per the previous comment on the complexity, there
                                    // can be at most N items on the stack so between this
                                    // and the iterations over the circles then there can only
                                    // be N items popped off the stack so the complexity of
                                    // all these tests on the circles on the stack is O(N).

现在的时间复杂度为O(N)。

测试用例1

S='2\n1 3\n5 1';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

输出: 3

测试案例2

S='3\n2 2\n1 1\n3 1';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

输出: 5

测试案例3

S='4\n7 5\n-9 11\n11 9\n0 20';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

输出: 6

测试案例4

S='9\n38 14\n-60 40\n73 19\n0 100\n98 2\n-15 5\n39 15\n-38 62\n94 2';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

输出: 11

测试案例5

S='87\n-730 4\n-836 2\n-889 1\n-913 15\n-883 5\n-908 8\n-507 77\n-922 2\n-786 2\n-782 2\n-762 22\n-776 2\n-781 3\n-913 3\n-830 2\n-756 4\n-970 30\n-755 5\n-494 506\n-854 4\n15 3\n-914 2\n-840 2\n-833 1\n-505 75\n-888 10\n-856 2\n-503 73\n-745 3\n-903 25\n-897 1\n-896 2\n-848 10\n-878 50\n-864 2\n0 1000\n-934 6\n-792 4\n-271 153\n-917 1\n-891 3\n-833 107\n-847 3\n-758 2\n-754 2\n-892 2\n-738 2\n-876 2\n-52 64\n-882 2\n-270 154\n-763 3\n-868 72\n-846 4\n-427 3\n-771 3\n-767 17\n-852 2\n-765 1\n-772 6\n-831 1\n-582 2\n-910 6\n-772 12\n-764 2\n-907 9\n-909 7\n-578 2\n-872 2\n-848 2\n-528 412\n-731 3\n-879 1\n-862 4\n-909 1\n16 4\n-779 1\n-654 68\n510 490\n-921 3\n-773 5\n-653 69\n-926 2\n-737 3\n-919 1\n-841 1\n-863 3';
R=/(\S+) (\S+)/ym;N=1;i=w=l=0;for(X=[];m=R.exec(S);){X[N++]={w:j=m[2]*1,l:k=m[1]-j,r:k+2*j};l=k<l?k:l;w=j<w?w:j}M=[];X.map(x=>M[(x.l-l+1)*w-x.w]=x);s=[];M.map(x=>{while(i&&s[i-1].r<x.r)N+=s[--i].w?0:1;i&&(s[i-1].w-=x.w);s[i++]=x});while(i)N+=s[--i].w?0:1

输出: 105

先前版本

C=S.split('\n');N=1+C.shift()*1;s=[];C.map(x=>x.split(' ')).map(x=>[w=x[1]*1,x[i=0]*1+w]).sort((a,b)=>(c=a[1]-2*a[0])==(d=b[1]-2*b[0])?b[0]-a[0]:c-d).map(x=>{while(i&&s[i-1][1]<x[1])N+=s[--i][0]?0:1;i&&(s[i-1][0]-=x[0]);s[i++]=x});while(i)N+=s[--i][0]?0:1

有评论:

C=S.split('\n');                    // Split the input into an array on the newlines.
                                    // O(N)
N=1+C.shift()*1;                    // Remove the head of the array and store the value as
                                    // if there are N disjoint circles then there will be
                                    // N+1 regions.
                                    // At worst O(N) depending on how .shift() works.
s=[];                               // Initialise an empty stack.
                                    // O(1)
C .map(x=>x.split(' '))             // Split each line into an array of the two values.
                                    // O(1) per line = O(N) total.
  .map(x=>[w=x[1]*1,x[i=0]*1+w])    // Re-map the split values to an array storing the
                                    // radius and the right boundary.
                                    // O(1) per line = O(N) total.

  .sort((a,b)=>(c=a[1]-2*a[0])==(d=b[1]-2*b[0])?b[0]-a[0]:c-d)
                                    // Sort the circles on increasing left boundary and
                                    // then descending radius.
                                    // O(1) per comparison = O(N.log(N)) total.
  .map(x=>{                         // Loop through each circle
    while(i&&s[i-1][1]<x[1])        // Check to see if the current circle  is to the right
                                    // of the circles on the stack;
      N+=s[--i][0]?0:1;             // if so, decrement the length of the stack and if the
                                    // circle that pops off has radius equal to the total
                                    // radii of its children then increment the number of
                                    // regions by 1.

                                    // Since there can be at most N items on the stack then
                                    // there can be at most N items popped off the stack
                                    // over all the iterations; therefore this operation
                                    // has an O(N) total cost.
    i&&(s[i-1][0]-=x[0]);           // If there is a circle on the stack then this circle
                                    // is its child. Decrement the parent's radius by the
                                    // current child's radius.
                                    // O(1) per iteration
    s[i++]=x                        // Add the current circle to the stack.
  });
while(i)N+=s[--i][0]?0:1            // Finally, remove all the remaining circles from the
                                    // stack and if the circle that pops off has radius
                                    // equal to the total radii of its children then
                                    // increment the number of regions by 1.
                                    // Since there will always be at least one circle on the
                                    // stack then this has the added bonus of being the final
                                    // command so the value of N is printed to the console.
                                    // As per the previous comment on the complexity, there
                                    // can be at most N items on the stack so between this
                                    // and the iterations over the circles then there can only
                                    // be N items popped off the stack so the complexity of
                                    // all these tests on the circles on the stack is O(N).

除排序为O(N.log(N))以外的所有时间的总时间复杂度为O(N)-但是,将其替换为存储桶排序将把总复杂度降低为O(N)。

所需的内存为O(N)。

猜猜我的待办事项清单上接下来是什么...桶中的字符少于150个字符。完成了


桶排序只有平均复杂O(n)(其实O(n+k)),但O(n^2)还是O(n log n)最坏的情况下取决于水桶内使用的排序算法上,所以你需要做的是在50个字符。
Martin Ender 2014年

@ m.buettner-可以以O(N)最坏情况下的复杂度完成存储桶排序。它依赖于对存储桶的仔细选择和O(1)算法来分配给存储桶。我之前已经做过(并证明了),我只需要将代码传输到JavaScript。上面的算法已经是O(N.log(N)),因此唯一的改进就是获得了O(N)排序算法。
MT0

我会对桶的证明和相应的选择感兴趣。:)
Martin Ender 2014年

cs.princeton.edu/~dpd/Papers/SCG-09-invited/…(第556页)给出了O(N)存储桶排序的示例。archive.org/stream/PlanarityTestingByPathAddition/…(第75页)提供了O(N)组合DFS搜索和存储桶排序的示例(时间复杂度在第76页上讨论)。
MT0

1
@ Mt0坚持在那里,您可以阅读我对问题的复杂性部分的补充。对于无穷大的数字,线性时间排序绝对是绝对不可能的
Niklas B.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.