首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >排序数组和未排序数组时间复杂度之间的DIfference

排序数组和未排序数组时间复杂度之间的DIfference
EN

Stack Overflow用户
提问于 2019-01-03 10:36:36
回答 2查看 10K关注 0票数 1

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

例如,如果我有一个数组,并希望找到值加到特定目标的两个索引,那么如果数组被排序或未排序,会不会造成时间复杂度的差异?

提前谢谢你帮我忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-03 12:21:36

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

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

所以你看第一项,2,你知道你必须在数组中找到数字9,如果它存在的话。对于未排序的数组,您必须执行线性搜索,以确定数组中是否存在9。

但是,如果您有一个排序数组,[1, 2, 3, 4, 5, 6, 7, 8],您有一个优势。当您看到值2时,您知道需要在数组中找到9。但是,因为列表是排序的,所以可以使用二进制搜索。不必查看列表中的每一项,只需查看其中的3项:

二进制搜索将查看第4项,然后是第6项,然后是第8项,最后确定9不在数组中。

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

票数 3
EN

Stack Overflow用户

发布于 2019-01-03 13:56:41

对于“目标和”问题,排序数组的优点更好:根本不搜索数组。相反,从两端的指针开始。如果和等于目标,则发出该值并将两个指针移入。如果小于目标,则增加较低的指针。否则,减少上指针。这将在O(n)时间内找到所有的解--在取O(n log )作为排序后。

对于注释中给出的情况,[40, 60, 1, 200, 9, 83, 17]流程如下所示:

代码语言:javascript
运行
AI代码解释
复制
Sort array:
[1, 9, 17, 40, 60, 83, 200]

Start your pointers at the ends, 1 + 200
The sum is 201, too large, so decrement the right pointer.
Now looking at 1 + 83.  This is too small; increment the left pointer.
Now looking at 9 + 83.  This is too small; increment the left pointer.
Now looking at 17 + 83.  This is the target; print (17, 83) as a solution
    and move *both* pointers.
Now looking at 40 + 60.  This is the target; print (40, 60) as a solution
    and move *both* pointers.
The pointers have now met (and passed), so you're done.

这是一个很好的例子。通常,对数组进行排序比依次检查每个元素要快得多,您可以选择在数组中查找东西。一个简单的二进制搜索是O(log ),有多种方法对特定应用程序进行优化。最坏的情况是,二进制(日志基2)搜索将很好地工作。

但是,对任意列表进行排序需要花费O(n log n)作为开销;您需要根据应用程序的需要计算这一次付款。例如,如果您的数组是按键值(例如名称或ID号)排序的某种数据库,并且必须执行数百万来自用户请求的搜索,那么在进行任何搜索之前最好以某种方式对数据库进行排序。

如果你想要一个彻底的介绍,研究“分类和搜索”。一本很好的参考资料是唐纳德·克努斯( Donald )的书名:“计算机编程艺术”(The Art of Computer Programming)第二卷。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54027951

复制
相关文章
[javaSE] 数组(排序-冒泡排序)
选择排序和冒泡排序性能都很低,提高性能的方法,当需要换位置的时候,先不换,先把需要换位置的角标放到栈内存中,等最后一次性在堆内存中交换
唯一Chat
2019/09/10
1.5K0
[javaSE] 数组(排序-选择排序)
两层嵌套循环,外层循环控制次数,内层循环进行比较 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ if(arr[x]>arr[y]){ } } } 此时的代码有问题,内层的循环多比较了已经排好序的部分,都在最前面,需要去掉 for(i
唯一Chat
2019/09/10
1.3K0
数组排序
默认排序sort() 升序asort(),rsort,ksort 降序arsort(),krsort 按键(k)名排列:ksort,krsort 按值(a)排列:asort,arsort <?php
十月梦想
2018/08/29
1.3K0
数组排序
数组排序
/* 功能:数组排序 日期:2013-06-17 */ #include <stdio.h> #include <stdlib.h> void sort(int p[],const int len); int findMinIndex(int p[],const int len); int m=0; int main(void) { int Array[7]={23,45,12,89,33,101,67}; int i; printf("数组的初始状态是:"); for (i=0;i<7;
WindCoder
2018/09/20
9890
数组排序
/* 功能:数组排序 日期:2013-05-21 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define LEN 7 int main(void) { int num[LEN]={0}; int i,j,tmp; printf("数组:"); for (i=0;i<=LEN-1;i++) { scanf("%d",&num[i]); } for (i
WindCoder
2018/09/20
1K0
Java数组、排序和查找
创建一个char 类型的26 个元素的数组,分别放置’A’-‘Z’。使用for 循环访问所有元素并打印出来。提示:char 类型数据运算’A’+2 -> ‘C’
timerring
2023/04/21
9320
Java数组、排序和查找
JavaScript 数组排序——快速排序[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133116.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/14
7380
JS数组的排序和反转
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136273.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/19
2.2K0
数组排序方法(冒泡排序)
冒泡排序是排序算法中较为简单的一种,英文名为Bubble Sort。它遍历所有的数据,每次对相邻元素进行两两比较,如果顺序和预先规定的顺序不一致,则进行位置交换;这样一次遍历会将最大或最小的数据上浮到顶端,之后再重复同样的操作,直到所有的数据有序。
pigeon
2022/04/11
7030
Java 数组、排序和查找
# Java 数组、排序和查找 # 为什么需要数组 一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少? 请
用户9615083
2022/12/25
2K0
Java 数组、排序和查找
ASP数组排序_字符数组
<% ‘===================================== ‘作者:80端口,阿里西西 ‘时间:2005-12-23 ‘作用:对数据进行重新排序 ‘===================================== Function NewOrder(sz) Dim ali,icount,i,ii,j,itemp ali=split(sz,”,”) icount=UBound(ali) For i=0 To icount For j=icount – 1 To i Step -1 If j+1 <= UBound(ali) Then If int(ali(j))<int(ali(j+1)) Then itemp=ali(j) ali(j)=ali(j+1) ali(j+1)=itemp End If End If Next Next For ii=0 to Ubound(ali) If ii = Ubound(ali) Then NewOrder = NewOrder & ali(ii) Else NewOrder = NewOrder & ali(ii) & “,” End If Next End Function %>
全栈程序员站长
2022/11/01
3.5K0
json数组排序
有时需要根据json对象的某个属性排序json数组,javascript端有sort这个函数,具体可以参考:http://www.w3school.com.cn/jsref/jsref_sort.asp
johnhuster的分享
2022/03/28
1.6K0
JavaScript 数组排序
sort 方法默认会将元素当成字符串相互对比,也可以传入自己写的比较函数来决定排序顺序。如:
全栈程序员站长
2022/07/01
7380
数组希尔排序
希尔排序是建立在插入排序的基础之上的,只不过是将数据中做插入排序之前做了一次分组,他的分组是根据用户输入的一个数字来决定分多少组的,比如有如下数据:
我与梦想有个约会
2023/10/20
1390
数组希尔排序
为什么处理一段已排序的数组比处理一段未排序的数组快
按道理说,也不应该是缓存造成的。仔细看一下这些代码,做的无非就是判断,加法这些很平常的运算。到底是什么导致了这样的差异呢?
ClearSeve
2022/02/10
4780
旋转排序的数组
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
羽翰尘
2020/07/21
8430
数组排序的实现
利用Collections.reverseOrder()方法:倒叙排列,数组倒置。
泰斗贤若如
2019/06/19
6410
数组的排序方法
选择排序法指每次选择所要排序的数组中的最大值(由大到小排序,由小到大排序则选择最小值),将这个数组元素的值与最前面没有进行排序的数组元素的值互换。
pigeon
2022/04/11
7570
数组的排序方法
数组选择排序
选择排序的规则是让第 i 个元素分别于后边的元素进行比较,记录最小的元素的位置,遍历完成之后,进行交换。将数组中每一个元素进行处理后最终得出有序的数据。其交换步骤图如下(摘自 传智播客 教师课件):
我与梦想有个约会
2023/10/20
1630
数组选择排序
数组堆排序
堆排序也是一种空间换时间的做法,速度相对较快,我们需要生成一个动态的临时数组,以二叉堆的格式将数据插入到数组中,表现形式如下图:
我与梦想有个约会
2023/10/20
1650
数组堆排序

相似问题

排序数组(时间复杂度)

15

数组平方和排序的时间复杂度

34

打印排序数组和未排序数组时的时间差

10

未排序数组插入的最佳情况和最坏情况时间复杂度

10

在包含重复值的排序数组和未排序数组中执行搜索和插入操作的时间复杂度

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档