【问题标题】:Binary Search O(log2(n)) Change of Base二分查找 O(log2(n)) 碱基变化
【发布时间】:2015-05-20 11:35:14
【问题描述】:

在二分搜索中,我知道它的复杂性是 log2(n)。搜索利用了列表是有序的这一事实,因此我们可以假设数组中的每个项目都有一个“标签”(其索引)作为附加信息以减少运行时间。有没有办法添加额外的“标签”以进一步降低其复杂性?换一种说法,我们是否可以实施另一个层次的组织来更有效地搜索项目?

【问题讨论】:

  • 啊哈可能是语言误用。我的意思是它使用它,我猜滥用这个词有点咄咄逼人。
  • 用你自己的话来说,是的,有一种方法可以更巧妙地“标记”。并且您平均获得 O(1) 性能。这叫做散列!
  • 请您删除“二叉树”标签吗?不相关。

标签: performance search binary-search organization


【解决方案1】:

如果您的搜索算法基于比较,并且列表是有序的,则 log2(n) 是下限。但是,有一些时空权衡算法或数据结构也可用于搜索。最常见的是HashTable

【讨论】:

    【解决方案2】:

    我不知道这是否适用于您的情况,但如果您正在处理简单的关联逻辑(即,您没有键/值区分,只有键),并且您的客户已经可以访问到键并且只是试图找出一个元素是否属于容器,那么这里有一个非常简单和快速的解决方案,在寻找数据结构来完成这项工作时,很多人经常会遇到这种情况。

    只需将一个或多个反向指针(或取决于语言的反向引用)存储到密钥内的容器中。现在您不再搜索容器来查看密钥是否属于它。您在其反向指针中搜索密钥本身,以查看它是否属于容器。

    如果您的密钥一次不属于太多容器,这通常会胜过最快的哈希表实现。如果它们一次只属于一个容器,那么这是一种非常快速的恒定时间检查,可以简单地查看反向指针是否指向您感兴趣的容器。

    这是一个比与您的键表示完全解耦的容器更具侵入性的解决方案,但如果您的需要符合条件:也就是说,您正在使用简单的关联逻辑,并且您的键一次不属于太多此类聚合。

    【讨论】:

    • 这种算法有术语吗?我用谷歌搜索了你提到的几个关键词,但我有点不确定这种方法是如何工作的,并且想了解更多。
    • 调用算法/数据结构还不够复杂,因为它只是一个后向指针或标志,用于指示元素何时位于容器内,以及是否是后向指针,哪个。如果你还在键中存储了一个索引,那么你不仅可以找出一个元素属于哪个容器,还可以找出 O(1) 中的位置。
    • 这就像在树形结构中如何找出哪个父节点与子节点相关联?好吧,您可以使用前序/中序/后序树遍历来搜索整个树,或者您可以用空间交换时间,并在子节点中存储指向父节点的反向指针。然后您可以立即知道父节点被赋予了什么子节点。如果你做这些类型的“给定一个孩子,父母是什么?”查询很多,那么反向指针可以极大地帮助不断搜索数据结构。
    • 基本上,您始终可以使用关联结构将数据与元素外部关联,例如哈希映射。给定一些 Key 类型 K,您可以关联比它通常在外部拥有的更多数据。但是这种外部关联意味着您要付出搜索的代价来获取与K 关联的数据。或者,您始终可以将数据内部 K 存储,然后将关联中间人排除在外。如果您正在执行集合逻辑,您可以存储 K 所属的集合,将搜索变成对字段值的简单检索。
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2019-08-18
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2011-10-24
    • 2017-12-05
    相关资源
    最近更新 更多