arrays - 二分搜索与基于键的搜索

标签 arrays algorithm data-structures redis binary-search

假设我有 10000 个项目,每个项目都由一个 id 表示(1、2、3 等。此外,键可以是最多 10e6 的任何大数),并且我可以选择使用键值存储(Redis、准确地说)和一个排序数组。

键值:

{
    1: 1,
    2: 2,
    3: 3 //and so on
}

排序数组:

[1, 2, 3, ...]

现在,如果我想搜索一个项目,哪个会更快(以及为什么):

  1. 访问 key ,例如:obj['3'] 或,
  2. 对已排序数组应用二分搜索,复杂度为 log(N)?

或者是否有任何其他数据结构比上述两个选项更快。

最佳答案

如果域密集(例如 1、2、3、4、5 而不是 1、4、6、18),则迄今为止最快的数据结构是简单数组。那么对象的索引就是对象id。

如果您的域名较小,您也可以使用此功能。例如,如果所有 id 都小于 100,000,您可以简单地创建一个包含 100,000 个元素的数组,并使用某个值来指示缺少的元素。

如果没有,那么最好的选择是键值数据结构。它为此进行了优化。它可以实现为 HashMap 或排序树,您可以假设您的编程语言设计者为您选择了最佳选择。

如果选择由您决定(例如在 C++ 中),则 HashMap 对于整数键来说应该是最快的。

关于arrays - 二分搜索与基于键的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33671850/

相关文章:

java - 如何迭代独立选择的每个排列?

c - 未加权图的 Dijkstra 算法

algorithm - 选择一个低效的数据结构,它会给我们带来什么问题?

java - 更改字符串以匹配 char 数组

javascript - 如何拆分字符串对象然后连接并添加到数组

java - 迭代快速排序方法

ruby - 将两个数组组合成哈希

java - 每个节点在链表中扮演什么角色?

spring - 使用 Linkedin 的 Spring Social 将 LinkedIn JS API token 交换为 REST token

c - 如何打印结构体的成员?