数据结构引入堆栈之类的数据,并像散列表一样存储在桶中?

时间:2010-08-27 15:28:12

标签: data-structures stack hashtable

我需要一种能够像堆栈一样引入数据的算法,因此当我扫描结构时,我可以按照它们引入的相同顺序读取它们,以便顺序访问。这些值也存储在存储桶中,就像哈希表一样,因此我可以将整个结构分段为磁盘存储并具有快速随机访问。

是否有这样的算法,或者我应该有两个独立的结构?什么是最好的策略?

祝你好运!

4 个答案:

答案 0 :(得分:2)

我可能会这样做:

  1. 创建实际存储条目的哈希表
  2. 创建一个堆栈,用于存储对象的真实内存位置(而不是对象本身)
  3. 在类(或类似的东西)后面抽象这两个结构,以便向用户隐藏它的真实实现。

答案 1 :(得分:1)

这就像有序地图,对吧?这些通常是通过将链接列表与您想要用于实现地图的任何内容(例如哈希表)相结合来实现的。

在Ruby 1.9中,Hash类的规范(令人困惑的是Ruby如何拼写“Map”)被改变,以便保留插入顺序。我知道的大多数Ruby 1.9实现都将它实现为列表和哈希表的某种组合。 Rubinius的实现特别容易阅读,因为它是用Ruby编写的100%:kernel/common/hash.rb

Java有一个有序映射的实现,称为LinkedHashMap。以下是Oracle OpenJDK 7的来源:/share/classes/java/util/LinkedHashMap.java

Apache Commons Collections有一个OrderedMap接口和两个实现:LinkedMapListOrderedMap

如果你有点小心,你应该能够保留无序地图的渐近复杂性保证。

答案 2 :(得分:0)

首先,我认为你的意思是“引入像队列这样的数据”。堆栈将按照输入的相反顺序返回数据。 (另外,我不确定你的意思是“引入数据”---我不确定这是一个语言问题,还是我从未听过的数据结构表达式。)

我的建议是使用侵入式链表(链接存储在数据对象中)来创建线性列表。然后,您可以将数据对象(附带链接)放入哈希表中。

答案 3 :(得分:0)

像stargazer一样指出一个带有两个数据结构的抽象类是一种方法。但是有一些考虑因素。

  1. 当您弹出一个值时,您还有它的键吗?如果没有,那么从hashmap中删除它将是一个艰难的操作(不是O(1))。如果这将是获取数据的主要模式,那么它可能值得保持每个对象键入该对象。

  2. 从表中删除值时,您还必须将其从列表中删除。也许值得保持对象ListNode在对象中从堆栈/队列中删除O(1)。

  3. 如果一种移除方法占主导地位,可能很容易采取上述处罚之一。

    1. 例如,如果你不是通过键(ala hashmap)删除东西而只是弹出(ala堆栈/队列),并且密钥很容易从对象中计算出来,(p1)并没有太大的惩罚和抽象方法有效。

    2. 如果删除的hashmap方法确实占主导地位,那么通过hashkey对堆栈进行排序,然后二进制搜索然后从堆栈/队列中删除它可能是值得的。

    3. 如果你想让hashmap存储所有内容(永远不会删除数据),但保留一个单独的队列/堆栈进行处理(只有删除数据),那么抽象就会很完美。

    4. 但是,如果不是这种情况,并且您无法更改对象(强制它实现您的缓存方案),那么这意味着您必须自己缓存这两个值(对象键和列表节点)。它为您的抽象类引入了第三个数据结构。在这一点上,你必须问自己这种抽象方法是否值得?在这些情况下,数据将被平等地(或不可预测地)移除,然后它值得做一些预先登记的事情,ala jorg mittag。我认为那些实现是直接的哈希映射,但是每个hashnode也有一个像列表一样的prev和next链接,而hashmap本身有一个尾部和头部。 (对于像pop / push这样的堆栈/队列)

      基本上 归结为您将如何使用此数据结构。没有算法可以被视为最佳策略,没有细分所有方法将被调用的用例。