一个无序的数组,有什么高效率的查找算法?

SHHMing 2008-11-13 02:55:05
一个无序的数组
比如
int a[3000]

要在里面查num1和num2的索引,
有什么好的方法

前提是数组无序,不考虑排序后再去查
,有什么高效率的算法吗?

方法一:
从a[0]开始查,查到num1或num2后,接着查另外一个没查到的

方法二:
同时从头尾向中间查,这个似乎效率更加高点

有什么好方法么
...全文
2448 23 打赏 收藏 转发到动态 举报
写回复
用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)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧