社区
C++ 语言
帖子详情
一个无序的数组,有什么高效率的查找算法?
SHHMing
2008-11-13 02:55:05
一个无序的数组
比如
int a[3000]
要在里面查num1和num2的索引,
有什么好的方法
前提是数组无序,不考虑排序后再去查
,有什么高效率的算法吗?
方法一:
从a[0]开始查,查到num1或num2后,接着查另外一个没查到的
方法二:
同时从头尾向中间查,这个似乎效率更加高点
有什么好方法么
...全文
3026
23
打赏
收藏
一个无序的数组,有什么高效率的查找算法?
一个无序的数组 比如 int a[3000] 要在里面查num1和num2的索引, 有什么好的方法 前提是数组无序,不考虑排序后再去查 ,有什么高效率的算法吗? 方法一: 从a[0]开始查,查到num1或num2后,接着查另外一个没查到的 方法二: 同时从头尾向中间查,这个似乎效率更加高点 有什么好方法么
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaoshu666
2012-06-27
打赏
举报
回复
那么,遍历查找和,排序后查找那个效率高???
SHHMing
2008-11-14
打赏
举报
回复
谢谢各位,我想明白了,一回事,呵呵
weekly123
2008-11-13
打赏
举报
回复
就是老老实实遍历吧,没别的办法
dreamer_shax
2008-11-13
打赏
举报
回复
[Quote=引用 19 楼 BaihowFF 的回复:]
引用 16 楼 dreamer_shax 的回复:
1,方法1和方法2没有什么区别,效率也一样
同时从两头找肯定是用到多线程,那我用3000个线程,只要比较1次就行了?
2,楼上讨论的一次比较2次,和一次比较一次,也没有本质区别,效率也一样
证明:假设Num1的索引是p1,Num2的索引是p2,假设p1 <p2
则一次比较2次,比较次数为 2*p1 + (p2-p1) = p1+p2;
一次比较1次的比较次数为 p1 + p2
-----------------------
我…
[/Quote]
呵呵,楼上的很对,可是讨论算法效率的时候,加入多线程没有什么意义。我是从这个角度来说2个方法没什么区别。实际运行的时候肯定是多线程快啦。
BaihowFF
2008-11-13
打赏
举报
回复
[Quote=引用 16 楼 dreamer_shax 的回复:]
1,方法1和方法2没有什么区别,效率也一样
同时从两头找肯定是用到多线程,那我用3000个线程,只要比较1次就行了?
2,楼上讨论的一次比较2次,和一次比较一次,也没有本质区别,效率也一样
证明:假设Num1的索引是p1,Num2的索引是p2,假设p1 <p2
则一次比较2次,比较次数为 2*p1 + (p2-p1) = p1+p2;
一次比较1次的比较次数为 p1 + p2
-----------------------
我的观点:
如果是一个乱序数组,…
[/Quote]
不对...
多线程其实可以加快速度...但是次数不会少只会多...
就拿两个线程说说吧...
可以把3000个数分两组...同时进行查找...
我有双核CPU...可以同时跑两个线程...所以在相同时刻可以多做一倍的事情...(但实际上没有这么快...那是intel的事情)
所以多线程是有道理的..如果有4线程或者8线程的cpu...将数组细分...肯定是会得到性能提升...就算法而言...效率一样...
0黄瓜0
2008-11-13
打赏
举报
回复
1,方法1和方法2没有什么区别,效率也一样
同时从两头找肯定是用到多线程,那我用3000个线程,只要比较1次就行了?
---------------
多线程不要滥用,线程的开销是很大的。
0黄瓜0
2008-11-13
打赏
举报
回复
多核时代,充分利用每一个cpu。 也就是把数组分为几部分,使用多线程一齐查找。
dreamer_shax
2008-11-13
打赏
举报
回复
1,方法1和方法2没有什么区别,效率也一样
同时从两头找肯定是用到多线程,那我用3000个线程,只要比较1次就行了?
2,楼上讨论的一次比较2次,和一次比较一次,也没有本质区别,效率也一样
证明:假设Num1的索引是p1,Num2的索引是p2,假设p1<p2
则一次比较2次,比较次数为 2*p1 + (p2-p1) = p1+p2;
一次比较1次的比较次数为 p1 + p2
-----------------------
我的观点:
如果是一个乱序数组,没有任何其他信息,还是老老实实遍历吧
羽盛
2008-11-13
打赏
举报
回复
SHHMing : 方法一最多要循环3000次
方法二最多要循环1500次就可以了啊
我还是不太明白,这两个方法效果真的一样么?
循环语句的执行基本不会不会影响效率, 关键是循环里才操作。 方法1,2比较的次数是一样的。
BaihowFF
2008-11-13
打赏
举报
回复
[Quote=引用 10 楼 SHHMing 的回复:]
引用 7 楼 BaihowFF 的回复:
引用 5 楼 SHHMing 的回复:
引用 1 楼 BaihowFF 的回复:
都无序数组了...这两个方法其实效率是一样的...
为什么一样???
因为无序啊...所以每个你期望的数字出现在任何地方的概率都是n分之1...
方法一最多要循环3000次
方法二最多要循环1500次就可以了啊
我还是不太明白,这两个方法效果真的一样么
[/Quote]
但是你循环虽然减半了...但是里面会多出另外两个if语句啊...
如果是3000个数...你不想循环显然也是可以的...写3000组语句就可以了...这样在效率上基本没有区别...
hai040
2008-11-13
打赏
举报
回复
或者一边找一边排序
第一次查找x可以把数组分成3部份,<=x/>x/未知
第二次查找就可以缩小范围,再把数组分细
SHHMing
2008-11-13
打赏
举报
回复
我现在的需求就是
一个无序的数组
int a[3000]
里面查num1和num2的索引,就是查两个的索引,不考虑3个,4个等等
我想看看有什么比方法一要效率好的方法
还有方法一二为什么效果一样,我有点想不明白,请指教啊
hai040
2008-11-13
打赏
举报
回复
排序后再查
SHHMing
2008-11-13
打赏
举报
回复
[Quote=引用 7 楼 BaihowFF 的回复:]
引用 5 楼 SHHMing 的回复:
引用 1 楼 BaihowFF 的回复:
都无序数组了...这两个方法其实效率是一样的...
为什么一样???
因为无序啊...所以每个你期望的数字出现在任何地方的概率都是n分之1...
[/Quote]
方法一最多要循环3000次
方法二最多要循环1500次就可以了啊
我还是不太明白,这两个方法效果真的一样么
lann64
2008-11-13
打赏
举报
回复
[Quote=引用 5 楼 SHHMing 的回复:]
引用 1 楼 BaihowFF 的回复:
都无序数组了...这两个方法其实效率是一样的...
为什么一样???
[/Quote]
除非象楼上说的,你是多线程的,否着从哪开始对无序数组,只能是撞大运,基本上都应该是O(n) 复杂度。最坏情况也都是完全遍历一遍。
SHHMing
2008-11-13
打赏
举报
回复
[Quote=引用 6 楼 lann64 的回复:]
方法1不可取,那要遍历两遍。
如果就找两个目标,用不着先查一个,找到了再找第二个。可以一起找,每次比较两次。要是找M个,那还是先排序吧。
至于是从头开始,还是从两端开始,对无序数组没有效果。
[/Quote]
我是仅仅遍历一遍,一次比两个
循环次数取决于靠后的一个
BaihowFF
2008-11-13
打赏
举报
回复
[Quote=引用 5 楼 SHHMing 的回复:]
引用 1 楼 BaihowFF 的回复:
都无序数组了...这两个方法其实效率是一样的...
为什么一样???
[/Quote]
因为无序啊...所以每个你期望的数字出现在任何地方的概率都是n分之1...
lann64
2008-11-13
打赏
举报
回复
方法1不可取,那要遍历两遍。
如果就找两个目标,用不着先查一个,找到了再找第二个。可以一起找,每次比较两次。要是找M个,那还是先排序吧。
至于是从头开始,还是从两端开始,对无序数组没有效果。
SHHMing
2008-11-13
打赏
举报
回复
[Quote=引用 1 楼 BaihowFF 的回复:]
都无序数组了...这两个方法其实效率是一样的...
[/Quote]
为什么一样???
elephont9527
2008-11-13
打赏
举报
回复
无序数组,从那儿开始都一样,何来优化一说
除了老老实实一个个找,没有任何办法
加载更多回复(3)
《数据结构
算法
实现及解析(高一凡)源代码
《数据结构
算法
实现及解析(高一凡)源代码
在
无序
数组
中如何
查找
指定值的位置(索引)及
算法
优化
数组
元素
查找
无序
查找
线性
查找
无序
数组
的二分
查找
法
我是
一个
只学了两个月C语言的小白,刚开始学指针。老师上课讲“二分
查找
”的时候强调只能用于有序
数组
,课后我本着巩固知识的态度自己写了一遍二分
查找
的代码,并思考能否对
无序
数组
进行排序操作后,用二分
查找
法找到目标数,并找到它在
无序
数组
中的下标。但这样就违背了二分
查找
法的初衷。二分
查找
法本来是为了在处理
一个
巨大
数组
时减少运算量,提
高效率
,比如在40多亿个数据中找数,运用二分
查找
只需要三十几次就够了,这比逐一排查快得多的多。但如果是一串很长的
无序
数组
,仅排序的运算量就比逐一排查要多,效率更低。
数组
实战:排序和
查找
算法
(
无序
数组
)
本文介绍了三种基础排序
算法
(选择排序、冒泡排序、插入排序)和二分
查找
的实现原理。选择排序通过每次选择最小元素交换位置;冒泡排序通过相邻元素比较交换;插入排序类似整理扑克牌,逐个插入正确位置。二分
查找
则利用有序
数组
特性,每次排除一半可能。文章建议通过画图模拟、手动排序练习来理解
算法
,并强调掌握这些基础
算法
对提高编程能力的重要性。文中提供了各
算法
的C语言实现代码片段,帮助初学者直观理解
算法
工作原理。
数组
常见
算法
数组
常见
算法
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章