![]() |
1
12
创建一个新数组,长度是输入数组的两倍。O(2n)
|
![]() |
2
4
基本上有两种方法可以做到这一点。
|
![]() |
3
3
如果我们允许输入按基数排序,那么我会改进一下Chris的解决方案:
两个“指针”中的每一个都在严格向前移动,所以总的复杂性是O(n),假设基数排序是O(n),平方和比较是O(1)。想必是谁提出了这个问题,就打算作出这些假设。
在回答提问者对另一个答案的评论时:如果输入中的整数不是有界的,那么我认为这是不可能的。仅仅计算一个整数的平方需要大于线性时间(至少:不知道乘法的线性算法),所以考虑一个大小为n位的输入,由两个大小为的整数组成。
|
![]() |
4
1
虽然我不能添加到上面的建议中,但是您可以通过首先找到数据集中的最小值和最大值(O(N))并将搜索限制到该范围来减少平均运行时间。例如,如果最大值是620,我知道列表中没有大于等于25的整数有平方。 |
![]() |
5
1
你也许可以用一些哈希集来帮助你。 迭代时, 如果该值在squares哈希集中,则会有一对(值是先前找到的值的平方)。 如果平方在值散列集中,则有一对(该值的平方已被传递) 否则,将值存储在一个中,将平方存储在另一个中。 |
![]() |
6
1
我个人认为,anon的答案(带有‘squares’的小算法)比它看起来更有用:从它的‘squares’行中删除‘remove all less than e from squares’行,该算法可以处理未排序的输入数组。 如果我们假设典型的家庭作业机器有足够的空间,“正方形”数据结构可以被建模为一个布尔标记数组,从而产生真正的O(1)查找时间。 |
![]() |
7
1
不进行排序,使用重复项:
迭代数组以查找最小和最大的整数。
o(n)
(虽然我没有排序,但是可以很容易地修改该算法以创建 a sorting algorithm 在O(n+k)时间和O(k)空间中是哪一类的) |
![]() |
8
1
如果我们使用C/C++ 32位无符号的int,可以存储的最大值是:4294967295=(2和lt;32)-1。我们能储存的最大面积是(1<<16)-1=65535。现在,如果创建一个位数组并将其存储在数组中,不管我们看到的是数字和/或其平方(每个“插槽”2位),我们都可以将总存储量减少到65535/4=16384字节。 在我看来,这不是过度的内存消耗,所以我们应该能够在不进行基数排序的情况下完成这项工作。O(N)算法可能如下所示:
这不是测试,不是很优化,一个适当的整数平方根会更好。 然而,编译器应该内联所有的位访问函数——这样它们就可以了。 注意,如果我们使用64位整数,那么内存消耗会变得更大,而不是16KB的数组,我们需要一个1GB的数组——可能不太实用。 |
![]() |
9
1
优化说明 哈希集和基数排序算法都可以通过注意三个事实进行优化:
下面的优化算法通常执行5倍的速度,使用的RAM少于未优化的情况的一半。在某些情况下,如果数据大小与二级/三级缓存大小相似,它们的执行速度可能快100倍或更高。 基于基数排序的优化算法 数据结构是五个整数列表:in、aodd、bodd、aeven、beven A和B列表使用了in的整数大小的一半。(例如,如果in=64位,A&B=32位)
如果线性扫描发现匹配,则立即返回该匹配。 这比直接的基数排序算法快得多的原因是:
基于哈希集的优化算法 数据结构是中的整数列表,加上两个哈希集A和B A和B集使用的整数大小是in的一半
这比简单的哈希集算法更快的原因是:
这里还有一个额外的小优化:a和b可以是一个散列集,它存储每个条目的位标志,以判断整数是在a还是b中(不能同时存在,因为这样算法就会终止)。 |
![]() |
10
0
如果我正确理解了这个问题,您必须检查数组中是否有指定的数字。也没有找到数组中所有的平方数。 只需维护两个布尔值(一个用于检查是否找到数字,另一个用于平方),迭代数组中的元素并测试每个元素。返回两个布尔值的和。 在伪代码中:
|
![]() |
11
0
1)使用hashmap可以得到o(n)。 2)如果你使用std::set在2组上:均等和赔率,你可以得到 2*o((n/2)对数(n/2))=o(n log(n/2)) 假设平均数大约和赔率一样多 |
![]() |
12
-1
如果数组没有排序,您将无法执行o(n)。 如果对其进行排序,则可以使用该属性在一次传递中进行排序,如下所示:
在哪里?
如果不排序,可以在O(n log n)中对其排序,然后使用此方法检查平方,这仍然比足够大的数据集上的原始解决方案更快。 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 7 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 7 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 11 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 12 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |