寻求速度最快的查找算法

andyzheung 2011-01-24 10:08:17
把圆周(0-360实数范围)任意分为16个区域,任意给定某个0-360之间的某个数,如何查找其位于哪个区域.
除了循环地挨个查找,哪位大侠有更好的想法.寻求效率(主要指速度)最高的算法.
先谢过了...
...全文
1076 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyzheung 2011-01-25
  • 打赏
  • 举报
回复
多谢大家,最后还是没换该算法,在其他的部分作了处理。
感觉目前算法这块自己还是太弱了,经验又少。
以后有算法方面的问题,希望能得到大家更多的帮助。。
networkwx 2011-01-25
  • 打赏
  • 举报
回复
9楼的不错,把所有元素的值看成区域, 这样给定下标就可以访问,即简单还高效。
a[200] = 1;//说明200在区域1
booksoon 2011-01-24
  • 打赏
  • 举报
回复
数据规模这么小,什么样的算法都可以~~~
cnmhx 2011-01-24
  • 打赏
  • 举报
回复
再补充一点:
记住,延拓后的第0个区域和第16个区域是同一个区域。
另外,为了简单,你可将第一次寻找的地址置为中间的第8个。这样就保证了最大二分搜索次数正好<4。
平均搜索效率提高4倍。(2/8)
cnmhx 2011-01-24
  • 打赏
  • 举报
回复
我猜想的,你的区域在2:[290-340],3:[340-10],。。。第三个区域查找时,上界就小于下界了。所以要变通一下下。将第三个区域变为两个[340-370],[-20-10],一个放在第16个地址,一个放在第0个地址。这样就构成了上下界都严格满足单调递增的17个区域。
再用上述的二分法查找,最多需要4次二分查找,就可找到你的答案。和你的遍历搜索效率比较是log16,和16的关系。
好运!
andyzheung 2011-01-24
  • 打赏
  • 举报
回复
LS的,先谢谢了。
先做出18个区域(边界延拓,为了在0和360所在的区域特殊处理),----这段没看明白.


恩,区域是连续的.就是把整个圆周分为16分(不一定是均分),然后给定一个0-360的某个数,去找位于哪个区间.
开始是用循环一个一个找,太慢了,达不到我们的要求.
后来也想过用折半查找或者哈希查找.但是,这个不完全有序.或者说是"循环有序".
比如: 1:[260-290],2[290-340],3:[340-10],4.......16..
我这个东西是跑在嵌入式处理器的,主频很低,速度慢,而我这个东西又要求很快,所以需要最快的定位区域的方法.
cnmhx 2011-01-24
  • 打赏
  • 举报
回复
搜索问题中的区域是连续的吧?
可以考虑用带上下界的二分搜索。
最简明的,先做出18个区域(边界延拓,为了在0和360所在的区域特殊处理),连续单调递增。
读入一个数,随即地和一个区域的地址上下界比较,若大于上界,则将此地址置为新搜索的下界地址。反之亦然。
。。。然后用二分法再搜索,直到找到读入数在某个区域的地址的上下界之间,或者只剩一个地址为止。
andyzheung 2011-01-24
  • 打赏
  • 举报
回复
没人帮忙啊.
andyzheung 2011-01-24
  • 打赏
  • 举报
回复
自己先顶一个.
mj5757 2011-01-24
  • 打赏
  • 举报
回复
呜呜。。都看不懂。。
绿色夹克衫 2011-01-24
  • 打赏
  • 举报
回复
二分吧,不过16个的话,个人感觉循环找就挺快的,应该比二分还快一些。
实数范围分360个怎么够呢!
超级大笨狼 2011-01-24
  • 打赏
  • 举报
回复
0-360实数范围
这点范围,用360个长的数组,直接找下标都可以了。
aliezeng77 2011-01-24
  • 打赏
  • 举报
回复
楼主:建议将跨360区间比如(350,20)拆成两个区间(0,20),(350,360),这样再用二分查找
,如果查找结果属于(0,20),(350,360),则属于区间(350,20)
丈八涯 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 icessl 的回复:]

可考虑用映射表.
如果圆周的范围是 0到360,不考虑小数点,可用一个数组表示某一点在哪个区间,如
int a[361];
系统初始化时,把 a[i]置上j,表示i在区间 j 里.
以后查找时,只要取下标就可以了,速度很快.
如果考虑1位小数,我们就把它乘以10,这样,范围就是0到3600,数组多开10倍就可以了.
[/Quote]
跟俺的想法一样。
不过嵌入式的话,内存往往更珍贵。
icessl 2011-01-24
  • 打赏
  • 举报
回复
可考虑用映射表.
如果圆周的范围是 0到360,不考虑小数点,可用一个数组表示某一点在哪个区间,如
int a[361];
系统初始化时,把 a[i]置上j,表示i在区间 j 里.
以后查找时,只要取下标就可以了,速度很快.
如果考虑1位小数,我们就把它乘以10,这样,范围就是0到3600,数组多开10倍就可以了.
zhanglei8893 2011-01-24
  • 打赏
  • 举报
回复
使用区间树即可,操作为log(n)的时间复杂度

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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