社区
数据结构与算法
帖子详情
寻求速度最快的查找算法
andyzheung
2011-01-24 10:08:17
把圆周(0-360实数范围)任意分为16个区域,任意给定某个0-360之间的某个数,如何查找其位于哪个区域.
除了循环地挨个查找,哪位大侠有更好的想法.寻求效率(主要指速度)最高的算法.
先谢过了...
...全文
1144
16
打赏
收藏
寻求速度最快的查找算法
把圆周(0-360实数范围)任意分为16个区域,任意给定某个0-360之间的某个数,如何查找其位于哪个区域. 除了循环地挨个查找,哪位大侠有更好的想法.寻求效率(主要指速度)最高的算法. 先谢过了...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)的时间复杂度
探索最速之道:Dijkstra
算法
的Go语言极致实践
本文介绍了基于Go语言开发的开源项目Dijkstra,它是Dijkstra
算法
实现库,专注于提供Golang领域
最快
的最短(长)路径计算方案。该项目优化了计算逻辑,有简洁API。适用于网络路由、物流路径等场景,具备
速度
快、易用、灵活、安全、文档清晰等特点。
【图像相似度计算】hash哈希
算法
实现
本文介绍了图像局部hash
算法
aHash、dHash、pHash,它们适合
查找
相似图片。aHash
速度
快但鲁棒性差,dHash
速度
快且鲁棒性好,pHash鲁棒性极高但计算复杂。还给出了借助成熟工具实现
算法
的方法及代码原理展示,以及使用代码的步骤。
独家|OpenCV 1.2 如何用OpenCV扫描图像、
查找
表和测量时间(附链接)
本文探讨了如何使用OpenCV遍历图像像素,深入理解
查找
表的使用和性能优势。通过减色
算法
示例,展示了不同遍历方法的效率差异,包括指针方法、迭代器和LUT函数。LUT被证实为
最快
的处理方式,而迭代器提供安全但较慢的选项。文章还提供了性能对比和相关源代码链接。
Gossip
算法
Gossip
算法
,灵感源自办公室八卦,确保分布式系统中节点状态最终一致。具有去中心化、容错性和最终一致性特点,适用于失败检测、动态负载均衡等场景。文章详细探讨了Gossip的通信方式、协调机制及其在Cassandra中的应用。
算法
:Gossip
算法
。
Gossip
算法
,灵感源自办公室八卦,实则为一种高效、去中心化的最终一致性
算法
。本文深入探讨Gossip
算法
的背景、特点、工作原理及其在Cassandra中的实现细节。
数据结构与算法
33,026
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章