用于保持最小值的数据结构

时间:2014-01-20 21:01:14

标签: algorithm

假设我们有一串字符(比如它们的值在0--255范围内,对于 ASCII 和范围0--65,535)。

以下是可能应用的任务列表:

  1. 继续跟踪每个唯一字符的索引(最新的一个);
  2. 获取最小index;
  3. 的字符
  4. 更新数据结构(删除2中返回的数据结构并添加新数据结构)。
  5. 以下是一个示例,索引 i 0到17

    aabbaaaacccddccccc
    

    我们可以像这样在线跟踪字符串,其中括号内的整数是相应字符的索引:

    • A(0)
    • a(1)b(2)
    • a(1)b(3)
    • ...
    • a(7)b(3)
    • a(7)b(3)c(8)
    • ...
    • a(7)b(3)c(10) 现在我们读取字符'd',我们需要用规则更新数据结构,比如删除索引最小的元素:b(3)并添加d(11)
    • a(7)d(11)c(10)
    • ...

    我们可以使用hashmap来跟踪每个唯一字符的索引:

    Map<Character, Integer> myMap = new HashMap<>(m);
    myMap.put(new Character(input.charAt(j)), j);
    

    但是当我们想要获得索引最小的字符时,我们可能会逐个浏览地图,这不如我想要的那么高效。

    我们可以使用优先级队列来存储元素,这确实给了我O(1)时间来获取最小元素;但我无法像地图一样更新优先级队列。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

除了将地图myMap从字符映射到位置之外,您还可以将SortedMap从一个位置更新为另一个字符。

对于每个字符c输入,您将:

  1. 在myMap中查找c以查找其索引i
  2. 如果存在,则从SortedMap中删除键i
  3. 将myMap [c]更改为指向新索引
  4. 将SortedMap [新索引]更改为指向c
  5. 如果要查找索引最小的元素,可以只查看SortedMap的第一个元素。使用SortedMap,这是一种有效的操作。