最快的方法是什么(从算法的角度以及实际的角度来看)?
我在按照以下思路思考。
我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。
另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。
我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。
如何最好地做到这一点?
最快的方法是什么(从算法的角度以及实际的角度来看)?
我在按照以下思路思考。
我可以添加到数组的末尾,然后使用Bubblesort,因为它的最佳情况(开始时是完全排序的数组)接近于此,并且具有线性运行时间(最佳情况)。
另一方面,如果我知道我是从排序数组开始的,则可以使用二进制搜索来查找给定元素的插入点。
我的直觉是,第二种方法几乎是最优的,但好奇地想知道那里有什么。
如何最好地做到这一点?
Answers:
我们计算数组元素的读写次数。要进行冒泡排序,您需要访问(从初始写入到结束,然后在最坏的情况下需要两次读取和两次写入才能进行n次交换)。要进行二进制搜索,我们需要2 log n + 2 n + 1(2 log n用于二进制搜索,然后,在最坏的情况下,2 n将数组元素向右移动,然后1将数组元素写入到其适当的位置)。
因此,这两种方法在数组实现上都具有相同的复杂性,但是从长远来看,二进制搜索方法需要较少的数组访问...渐近地,数组访问的数量减少了一半。当然,还有其他因素在起作用。
实际上,您可以使用更好的实现,并且只计算实际的数组访问次数(而不是对要插入的元素的访问次数)。你可以做的冒泡排序,并登录ñ + 2 ñ + 1的二进制搜索...因此,如果寄存器/缓存访问是便宜和数组访问是昂贵的,从终端搜索和沿途移(聪明冒泡排序插入)可能会更好,尽管不是渐近的。
更好的解决方案可能涉及使用不同的数据结构。数组为您提供O(1)访问(随机访问),但是插入和删除操作可能会花费很多。哈希表可能具有O(1)插入和删除操作,这将花费大量时间。其他选项包括BST和堆等。可能值得考虑应用程序对插入,删除和访问的使用需求,并选择一个更专业的结构。
还要注意,如果要将元素添加到n个元素的排序数组中,一个好主意可能是有效地对m个项目进行排序,然后合并这两个数组。同样,可以使用堆(堆排序)高效地构建排序后的数组。