气泡排序最多为O(n),最差为O(n^2),其内存使用量为O(1)。合并排序总是O(n log n),但其内存使用量为O(n)。关于排序的问题
我们将使用哪种算法来实现一个函数,该函数接受一个整数数组并返回集合中的最大整数,假定数组长度小于1000.如果数组长度大于1000,该怎么办?
气泡排序最多为O(n),最差为O(n^2),其内存使用量为O(1)。合并排序总是O(n log n),但其内存使用量为O(n)。关于排序的问题
我们将使用哪种算法来实现一个函数,该函数接受一个整数数组并返回集合中的最大整数,假定数组长度小于1000.如果数组长度大于1000,该怎么办?
对于O(1)内存使用情况,可以在O(n)时间内完成对数据集的连续扫描,寻找最大值。
您只需将当前最大值设置为第一个元素,然后再遍历所有其他元素,并将当前最大值设置为该值(如果该值较大)。伪代码:
max = list[first_index]
for index = first_index+1 to last_index:
if list[index] > max:
max = list[index]
的复杂也不会因元素的数量列表中的改变,因此也无所谓有多少。
的运行时间但是会改变(因为算法是O(n)的时间),如果它发现的最大快是很重要的,有许多的可能性。当列表更改时,这些都取决于做工作,而不是每次您需要这些信息时,因此它们更适合于阅读次数多于书面次数的列表,因此可以摊销成本。
选项1是保持列表排序,以便您可以抓住最后一个元素。这是可能是矫枉过正只是保持了最大值的记录。
选项2是在您插入或从列表中删除时重新计算最大值(以及保存它的元素的数量)。对于空列表,最初将max
设置为0并将maxcount
设置为0。
对于插入件:
maxcount
是0(该列表是空的),设置max
该数值和maxcount
为1max
,设置max
并将maxcount
设置为1.max
,请将1加到maxcount
。对于缺失:
max
,从maxcount
减去1。maxcount
为0,重新扫描列表以获得新的max
和maxcount
。这样,在任何时候,你有最大的价值(计数只是一个额外的“技巧”,以加快算法,其中有超过一个元素保持最大值)。我之前在数据分析应用程序中使用过这种方法,结果比重新排序要快得多 - 在这种情况下,我必须存储最小值和最大值,但它们是相同的想法。
简单的“编程101”方法用于追踪集合的极值是堆。 – Svante 2010-03-17 18:04:03
除非预分类,否则最大值始终为O(n)。如果预先分类,则较少。在搜索之前进行排序总是比O(n)更差...因此,一般来说,1,000个元素需要进行1,000次比较......只是比较字面意思。如果使用分类结构,它便宜。如果不是,它很昂贵。用分类结构插入更昂贵。 ...这就是为什么这是一个问题。
最大值不需要排序。这是功课吗?请用[作业]标签标记家庭作业。 – 2010-03-17 02:24:46
如果这是作业问题,这是一个邪恶的非sequitur。就像那个谜语:“你怎么拼写'民间'?你怎么拼写'玩笑'?怎么拼写'呱呱'?蛋的白色是什么名字?”。 – 2010-03-17 04:26:52