【问题标题】:How to represent a bit vector in java so I can search in O(log n)如何在 java 中表示位向量,以便我可以在 O(log n) 中搜索
【发布时间】:2013-06-21 06:00:02
【问题描述】:

我有一个元素列表,我需要为每个元素创建一个由位组成的签名。我最终会得到一个位向量列表。之后,我需要按字典顺序对该位向量列表进行排序。之后,我需要在已排序的向量列表中搜索位向量。

我发现如果我将签名表示为字符串,则排序将花费 O(N),使用二进制搜索进行搜索将花费 O(M logN),其中 M 是字符串签名的长度。

但我发现对于一般的数字,排序需要 O(n LogN) 并且使用二分搜索进行搜索需要 O(logN)。

我的问题是如何在java中表示位向量,以便我可以按字典顺序排序并达到与一般处理数字相同的性能?

我最关心的是使用二分搜索实现 O(logN) 搜索时间,因为有人在一篇论文中声称可以实现这一点,但没有提供任何线索。

【问题讨论】:

  • 排序永远只需要O(log n)。该声明中的复杂性是否颠倒了?
  • @HunterMcMillen 这是一个非常不合格的声明。如果我们在初始列表上引入约束,甚至可能需要 O(1)。
  • @HunterMcMillen 我修好了
  • 我知道您希望我更具体地说明我的主张,但显然手头的问题涉及未排序的元素。
  • @MarkoTopolnik 我理解你的意图,我只是好奇确实存在什么限制,因为我从来没有遇到过。

标签: java algorithm sorting search


【解决方案1】:

扩展@Keith 的建议,使用java.util.BitSet,但扩展它以实现Comparable。实施适合您的领域的字典比较。也许调整hashCode()equals() 以提高速度。

此时,您可以轻松地对 BitSet 集合进行排序,并使用二进制搜索。

或者,像往常一样,您可以写一个 Comparator 来代替进行字典比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多