Algorithm 节查找的数据结构/算法

Algorithm 节查找的数据结构/算法,algorithm,Algorithm,给定每个节的端点列表,我应该使用什么样的数据结构/算法来查找当前所在的节 例如,如果我有一个包含节标题和内容的网页 介绍(以100像素结束) 第1节(在350px处结束) 第2节(在700px处结束) 结论(在1200像素处结束) 评论 我现在在130像素,它应该返回到我现在在“第1部分” 选择1 通过端点数组进行二进制搜索 从对分导入左对分 arr=[1003507001200] 位置=左二等分(arr,130,0,arr[-1]) 然而,对于位置的每一次变化,这仍然需要O(对数n) 选

给定每个节的端点列表,我应该使用什么样的数据结构/算法来查找当前所在的节

例如,如果我有一个包含节标题和内容的网页

  • 介绍(以100像素结束)
  • 第1节(在350px处结束)
  • 第2节(在700px处结束)
  • 结论(在1200像素处结束)
  • 评论
我现在在130像素,它应该返回到我现在在“第1部分”

选择1 通过端点数组进行二进制搜索

从对分导入左对分
arr=[1003507001200]
位置=左二等分(arr,130,0,arr[-1])
然而,对于位置的每一次变化,这仍然需要O(对数n)

选择2 当前位置的哈希表查找

lookup={0:“简介”
1:“导言”
...
10:“第1节”
11:“第1节”
...
}
节=查找[130/10]
这很快,但是浪费了很多空间



是否有一种通用的数据结构/算法来处理这类问题?

我喜欢您的第一种选择,二进制搜索对于扫描非常有效,正如您所说的,第二种选择不节省空间

在计算机图形学中进行缩放的传统且非常通用的解决方案是a,它创建一棵树,可以通过坐标进行查找,而不会浪费内存。具体地说,它的搜索、删除和插入复杂度都是O(logn),空间复杂度是O(n)


尽管你只做了一个轴,而一个网页往往会有1-100个部分(而且不可能有数千个,更不用说数以百万计,或者数十亿个部分),然后我会亲自考虑使用一个非常简单的数组,然后在有可测量的利益/需要时移动到更复杂的k-树上。如果您是用C语言或另一种可以控制内存布局的语言编写的,那么由于现代CPU和内存层次结构(特别是预取器和缓存)的设计,结构数组的扫描速度会非常快。

最简单有效的方法是使用O(LogN)复杂度的二进制搜索

您的第二个选项具有更好的复杂性O(1),但与预填充相比有缺点。预填充使二进制搜索更加简单

如果不在运行时更新节,这两种方法都是最好的

如果需要在运行时添加/删除/更新节,则需要数据结构。
因为您需要使用O(N)更新预填充的数据。这意味着更新/添加/删除节操作最多需要O(N)。

section
数字不能太大,我想一个简单的数组可以确定您有多少节?是否可能在运行时创建/更新/删除节?我只是以网页上的节为例,但它实际上用于更大的数组,因此使用通用算法会更好@我没有想过要实时修改它,但是如果有一个很好的复杂度,那就太好了。@LeeChou在这种情况下,如果你也有一个更大的场景,并且想要一个通用的解决方案,那么n-k树就是最好的选择;插入和搜索的复杂度都是O(lgn),其空间效率是O(n)。密钥为顺序整数的哈希没有意义。如果您这样做,只需使用一个数组,这样查找就不需要对整数进行散列,并且您将获得更高的存储密度。