Data structures 像堆栈一样引入数据并像哈希表一样存储在存储桶中的数据结构?

Data structures 像堆栈一样引入数据并像哈希表一样存储在存储桶中的数据结构?,data-structures,stack,hashtable,Data Structures,Stack,Hashtable,我需要一个像堆栈一样引入数据的算法,这样当我扫描结构时,我可以按照引入的顺序读取它们,以便进行顺序访问。此外,这些值存储在bucket中,就像哈希表一样,因此我可以将整个结构分割为磁盘存储,并进行快速随机访问 有这样的算法吗,或者我应该有两个独立的结构?最好的策略是什么 致以最良好的祝愿 我可能会这样做: 创建一个哈希表,在其中实际存储条目 创建一个堆栈,用于存储对象(而不是对象本身)的真实内存位置 将这两个结构抽象到一个类(或类似的东西)后面,以便对用户隐藏其真正的实现 我可能会这样做: 创建

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

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


致以最良好的祝愿

我可能会这样做:

  • 创建一个哈希表,在其中实际存储条目
  • 创建一个堆栈,用于存储对象(而不是对象本身)的真实内存位置
  • 将这两个结构抽象到一个类(或类似的东西)后面,以便对用户隐藏其真正的实现

  • 我可能会这样做:

  • 创建一个哈希表,在其中实际存储条目
  • 创建一个堆栈,用于存储对象(而不是对象本身)的真实内存位置
  • 将这两个结构抽象到一个类(或类似的东西)后面,以便对用户隐藏其真正的实现

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


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

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


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

    这类似于有序映射,对吗?通常通过将链表与实现映射所需的任何内容(例如哈希表)组合来实现

    在Ruby 1.9中,
    Hash
    类的规范(Ruby拼写“Map”的方式令人困惑)被更改,从而保留了插入顺序。据我所知,大多数Ruby1.9实现都将其作为列表和哈希表的某种组合来实现。Rubinius的实现特别容易阅读,因为它100%用Ruby编写:

    Java有一个有序映射的实现,称为
    LinkedHashMap
    。以下是来自Oracle OpenJDK 7的源代码:

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


    如果您稍微小心一点,您应该能够保持无序映射的渐近复杂性保证。

    这类似于有序映射,对吗?通常通过将链表与实现映射所需的任何内容(例如哈希表)组合来实现

    在Ruby 1.9中,
    Hash
    类的规范(Ruby拼写“Map”的方式令人困惑)被更改,从而保留了插入顺序。据我所知,大多数Ruby1.9实现都将其作为列表和哈希表的某种组合来实现。Rubinius的实现特别容易阅读,因为它100%用Ruby编写:

    Java有一个有序映射的实现,称为
    LinkedHashMap
    。以下是来自Oracle OpenJDK 7的源代码:

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


    如果您稍微小心一点,您应该能够保持无序映射的渐进复杂性保证。

    就像stargazer指出的那样,一个具有两个数据结构的抽象类是实现这一点的一种方法。然而,也有一些考虑因素

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

  • 从表中删除值时,还必须将其从列表中删除。也许值得将objects ListNode保留在对象中,以便从堆栈/队列中删除O(1)

  • 如果有一种清除方法占主导地位,那么很容易接受上述惩罚之一

  • 例如,如果您不想按键(ala hashmap)和只按pop(ala stack/queue)删除对象,并且可以轻松地从对象中计算键,那么(p1)不会带来太大的损失,抽象方法也可以工作

  • 如果移除的hashmap方法真的占主导地位,那么按hashkey对堆栈进行排序,然后进行二进制搜索,然后将其从堆栈/队列中移除可能是值得的

  • 如果您希望hashmap存储所有内容(从不删除数据),但保留单独的队列/堆栈进行处理(仅删除数据),那么抽象将是完美的

  • 但是,如果这些都不是事实,并且您无法更改对象(强制它实现缓存方案),这意味着您必须自己缓存这两个值(对象键和listnode)。这为您的抽象类引入了第三种数据结构。在这一点上,您必须问问自己,使用这种抽象方法是否值得?在这些情况下,数据将以同样的方式(或不可预测的方式)被删除,那么做一些预滚的事情是值得的,ala jorg mittag。我认为这些实现是直接的hashmaps,b