【问题标题】:What algorithm is best adapt for a non-contiguous Array with Index Grouping?哪种算法最适合具有索引分组的非连续数组?
【发布时间】:2011-01-18 09:43:41
【问题描述】:

我需要一些帮助来用 C/C++ 编写算法(尽管任何语言示例都可以)。目的是一个容器/数组,它允许在任何索引处插入。但是,如果在与现有索引不接近的索引中插入元素,即会导致大量的空桶空间。然后数组将最小化空桶。

假设您有一组元素需要插入到以下索引处:

14
54
56
57
12
8
6
5678

一个连续的数组会产生一个数据结构。像这样的:

0
1
2
3
4
5
6 val
7
8 val
9
10
11
12 val
...

但是,我正在寻找一种解决方案,当索引不在其最近邻居的 x 个存储桶内时创建一个新数组。

类似这样的:

Array1
6 val
7 
8 val
10
11
12 val
13
14 val

Array2
54 val
56 val
57 val

Array 3
5678 val

然后在查找过程中使用某种索引映射来查找索引所在的数组。我的问题是我应该在插入期间使用哪种算法将索引组合在一起? (同时仍然保持良好的空间/时间折衷)


编辑: 感谢您到目前为止的答案。我要查看的数据将包含一两个非常大的索引范围,没有间隙,然后是一两个非常大的间隙,然后可能是几个“散乱的”单个值。还要对数据进行排序,所以哈希表就出来了。

【问题讨论】:

  • 如果您不必专门使用数组,请获取索引,将其包装在对象中并将其用作哈希键。那么你仍然只能有一个具有该索引的对象,并且你没有太多任意大的存储桶。
  • FWIW,您可能会发现关于我的问题的一些讨论很有趣:stackoverflow.com/questions/2267331/…

标签: c++ c algorithm


【解决方案1】:

我相信您正在寻找哈希图或更一般的地图。您可以使用 STL 提供的地图类。

这听起来正是您正在寻找的:

http://www.cplusplus.com/reference/stl/map/

【讨论】:

  • 我不知道谁对我们投了反对票,但我还给了你的。我认为不解释是不公平的。
  • 谢谢我为你做了同样的事情,因为我们似乎看到了类似的问题。
  • 我猜有些人将地图视为“反数组”,但这绝对是 C++ 的正确答案。
【解决方案2】:

根据具体情况,您正在寻找使用稀疏数组或某种散列的方法。一般来说:

  1. 如果您最终会得到由大间隙分隔的长时间填充存储桶,那么最好使用稀疏数组,因为它们在这种情况下可以很好地优化内存使用。
  2. 如果您只想在一大堆空洞中找到零散的条目,那么最好使用哈希。

【讨论】:

    【解决方案3】:

    也许你想要的是一个稀疏向量?试试 Boost implementation

    【讨论】:

      【解决方案4】:

      为什么不只使用哈希表/字典?如果您真的需要这种特定的东西,我首先想到的是B tree. 但可能还有比这更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 2013-05-04
        • 2016-04-20
        • 2012-06-13
        • 2019-10-17
        • 2011-12-24
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多