我需要一种能够像堆栈一样引入数据的算法,因此当我扫描结构时,我可以按照它们引入的相同顺序读取它们,以便顺序访问。这些值也存储在存储桶中,就像哈希表一样,因此我可以将整个结构分段为磁盘存储并具有快速随机访问。
是否有这样的算法,或者我应该有两个独立的结构?什么是最好的策略?
祝你好运!
答案 0 :(得分:2)
我可能会这样做:
答案 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
接口和两个实现:LinkedMap
和ListOrderedMap
。
如果你有点小心,你应该能够保留无序地图的渐近复杂性保证。
答案 2 :(得分:0)
首先,我认为你的意思是“引入像队列这样的数据”。堆栈将按照输入的相反顺序返回数据。 (另外,我不确定你的意思是“引入数据”---我不确定这是一个语言问题,还是我从未听过的数据结构表达式。)
我的建议是使用侵入式链表(链接存储在数据对象中)来创建线性列表。然后,您可以将数据对象(附带链接)放入哈希表中。
答案 3 :(得分:0)
当您弹出一个值时,您还有它的键吗?如果没有,那么从hashmap中删除它将是一个艰难的操作(不是O(1))。如果这将是获取数据的主要模式,那么它可能值得保持每个对象键入该对象。
从表中删除值时,您还必须将其从列表中删除。也许值得保持对象ListNode在对象中从堆栈/队列中删除O(1)。
如果一种移除方法占主导地位,可能很容易采取上述处罚之一。
例如,如果你不是通过键(ala hashmap)删除东西而只是弹出(ala堆栈/队列),并且密钥很容易从对象中计算出来,(p1)并没有太大的惩罚和抽象方法有效。
如果删除的hashmap方法确实占主导地位,那么通过hashkey对堆栈进行排序,然后二进制搜索然后从堆栈/队列中删除它可能是值得的。
如果你想让hashmap存储所有内容(永远不会删除数据),但保留一个单独的队列/堆栈进行处理(只有删除数据),那么抽象就会很完美。
但是,如果不是这种情况,并且您无法更改对象(强制它实现您的缓存方案),那么这意味着您必须自己缓存这两个值(对象键和列表节点)。它为您的抽象类引入了第三个数据结构。在这一点上,你必须问自己这种抽象方法是否值得?在这些情况下,数据将被平等地(或不可预测地)移除,然后它值得做一些预先登记的事情,ala jorg mittag。我认为那些实现是直接的哈希映射,但是每个hashnode也有一个像列表一样的prev和next链接,而hashmap本身有一个尾部和头部。 (对于像pop / push这样的堆栈/队列)
基本上 归结为您将如何使用此数据结构。没有算法可以被视为最佳策略,没有细分所有方法将被调用的用例。