排序和未排序数组时间复杂度之间的差异

时间:2019-01-03 18:36:37

标签: python-3.x algorithm sorting

因此,我对编程和计算机科学非常陌生,并且一直在尝试解决我的代码时尝试理解时间复杂性的概念。但是,在对数组进行排序时,我总是对一些事情感到困惑: 在我的理解中,解决排序数组问题应该是最好的情况,而未排序的数组则是最坏的情况。 我总是感到困惑的是,我们如何真正利用在涉及搜索的问题中对数组进行排序的优势?意思是,这将如何减少我的时间复杂度,因为我认为我将不得不运行循环相同的次数。

例如,如果我有一个数组,并且想找到两个索引,它们的值加到一个特定目标上,那么如果对数组进行排序或不排序,时间复杂度是否会有所不同?

预先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

让我们看一下您的示例问题:找到两个数字之和等于给定数字的数字。

假设您有一个未排序的数组:[2, 8, 1, 3, 6, 7, 5, 4],目标是11。

因此,您查看第一个项目2,并且知道必须在数组中找到数字9(如果存在)。对于未排序的数组,您必须进行线性搜索以确定数组中是否存在9。

但是,如果您有一个已排序的数组[1, 2, 3, 4, 5, 6, 7, 8],那么您将具有优势。当看到值2时,您知道需要在数组中找到9。但是由于列表已排序,因此可以使用binary search。不必查看列表中的每个项目,只需查看其中的三个:

二进制搜索将首先查看第4个项目,然后是第6个项目,然后是第8个项目,最后确定数组中没有9。

简而言之,在未排序的数组中进行搜索需要O(n)的时间:您可能必须查看每个项目,以查找所需的内容。排序数组使您可以加快搜索速度。不必检查每个项目,而只需要检查最多log2(n)个项目。当数字变大时,这将产生巨大的差异。例如,如果您的列表包含一百万个项目,则二进制搜索仅需检查其中的20个项目。顺序搜索必须查看全部百万。

答案 1 :(得分:0)

排序数组解决“目标总和”问题的优势甚至更好:您根本不需要搜索数组。而是从两端的指针开始。如果总和等于目标,则发出该总和并将两个指针移入。如果小于目标,则增加下一个指针。否则,递减上指针。这样将在O(n log n)进行排序之后,在O(n)时间找到所有解决方案。

对于注释中给出的情况,=IF($A2=B$1, 6, 10) 的过程如下:

[40, 60, 1, 200, 9, 83, 17]

这是一个可爱的例子。通常,对数组进行排序可为您提供多种选择,比依次检查每个元素要快得多。一个简单的二进制搜索是 O(log n),并且有多种方法可以针对特定的应用程序进行调整。最糟糕的是,二进制(对数为2)的搜索将很好地工作。

但是,对任意列表进行排序会产生 O(n log n)的开销;您需要将这笔一次性付款计入您的应用程序需求中。例如,如果您的数组是某种按键值(例如名称或ID号)排序的数据库,并且您必须根据用户请求执行数百万次搜索,那么以某种方式对数据库进行排序几乎肯定会更好在进行任何搜索之前。

如果要全面介绍,请研究“分类和搜索”。一个很好的参考书是唐纳德·克努斯(Donald Knuth)的同名书这是“计算机编程艺术”的第二卷。