冒泡排序最多为O(n),最差为O(n ^ 2),其内存使用率为O(1)。合并排序始终为O(n log n),但其内存使用量为O(n)。
我们将使用哪种算法来实现一个取整数数组并返回集合中最大整数的函数,假设数组的长度小于1000.如果数组长度大于1000,该怎么办? / p>
答案 0 :(得分:10)
数据集的顺序扫描,寻找最大值,可以在O(n)时间内完成O(1)内存使用。
您只需将当前最大值设置为第一个元素,然后运行所有其他元素,如果值更大,则将当前最大值设置为值。伪代码:
max = list[first_index]
for index = first_index+1 to last_index:
if list[index] > max:
max = list[index]
复杂性不管列表中的元素数量如何都不会改变,因此无论有多少元素都无关紧要。
运行时间会改变(因为算法是O(n)时间),如果找到最大快速是很重要的,那么有很多种可能性。这些都取决于列表更改时的工作,而不是每次您想要信息时,因此它们更适合读取比写入更频繁的列表,因此可以分摊成本。< / p>
选项1是保持列表排序,以便您可以抓住最后一个元素。这只是可能过分杀死,只保留最大记录。
选项2是在您插入或删除列表时重新计算最大值(以及保留它的元素数)。最初将max
设置为0,将maxcount
设置为0以获取空列表。
对于插入内容:
maxcount
为0(列表为空),请将max
设置为此值,将maxcount
设置为1。max
,请将max
设置为此值,将maxcount
设置为1。max
,请将{1}添加到maxcount
。删除:
max
,则从maxcount
减去1。maxcount
为0,则重新扫描列表以获取新的max
和maxcount
。这样,在任何时候,你都有最大值(计数只是一个额外的“技巧”来加速算法,其中有多个元素保持最大值)。我曾经在数据分析应用程序中使用过一次,结果比重新排序快得多 - 在这种情况下我必须存储最小值和最大值,但这是相同的想法。
答案 1 :(得分:1)
除非预先排序,否则最大值始终为O(n)。如果预先排序,则更少。在搜索之前排序总是比O(n)差...所以,通常,1,000个元素将进行1,000次比较......只是按字面比较。如果使用分类结构,它便宜。如果没有,那就太贵了。具有分类结构的插入更昂贵。 ......这就是为什么这是一个问题。