Problem 3 Implementation All O(1) data structure

Summary

  • 这道不是让我们keep 时间顺序,这题是大小顺序

  • 变化量为1(因为你每次最多增加1)的顺序模型

    • 对单一Data的每一次操作,导致的变化量至多为1:2D的结构设计

    • 单向排列次序不一定是个consecutive的次序

    • 当走流程的时候,新来一个key,走掉一个key,对于node的操作有很复杂,很可能新增或者删除现有的ListNode

      Node - Node - Node Freq2- Freq3 - Freq5

横向链接

  • DLL + Map

  • 对于所有变化量为1的reference Node我们可以实现对数量排序 + 所有对reference operation O(1)

纵向链接

  • 对于同样横向属性的key,我们可以再做一个DLL+Map,也可以存一个collection(List, Map)

easy case

  • 不需要任何的顺序, set/list

hard case

  • 同样的频率的情况下,对另一个field再进行比较和存储,再观察是不是变量为1的顺序模型again,如果是的话,可以再来一个map2+ dll2,而dll2 inside of dll1

case even more

  • 无限套娃

Middle Level:所有API走流程

  • inc(String key)

    • case 1: 这个key是第一次出现

      • case1.1 看看有没有对应的freq =1 的node

        • 创建一个并且加入map +dll(set)

      • case1.2 如果已经存在在freq为1的弄的

        • 把这个新的data加入到已经存在的node set里面

    • case 2: 这个key不是第一次出现

      • 首先得知道他是第几次出现(map里面拿freq node)

      • 我们应该把这个node放到现在的freq+1的freq node

      • 这个freq + 1一定是你现在的freqNode.next么?

      • case2.1 不存在freq +1 的node

        • 创建一个freq + 1的freqNode并且把这个node插入到当前freqNode之后

        • 对应的key加入到这个你插入的freqNode里

      • case2.2 存在freq + 1的node

        • 对应的key加入到这个你插入的freqNode里

      • 不管存在不存在,现在key都不是freqNode里的人了,你得从freqNode里把这个key删除

        • 你现在把这个key当前的freqNode里删除之后,有没有可能当前的freqNode里就没有任何key了?

        • 如果空了,我们就要连着这个FreqNode + Map删除

  • dec(String key)

    • case 1: 这个key是第一次出现

      • 直接return

    • case 2: 这个key不是第一次出现

      • 首先得知道他是第几次出现(map里面拿freq node)

      • 我们应该把这个node放到现在的freq+1的freq node

      • 这个key只出现了一次?我们不存在freq为0的FreqNode

        • 删除这个key + check freq为1的FreqNode是否需要删除

      • 这个freq - 1一定是你现在的freqNode.prev么?

      • case2.1 不存在freq - 1 的node

        • 创建一个freq - 1的freqNode并且把这个node插入到当前freqNode之前

        • 对应的key加入到这个你插入的freqNode里

      • case2.2 存在freq - 1的node

        • 对应的key加入到这个你插入的freqNode里

      • 不管存在不存在,现在key都不是freqNode里的人了,你得从freqNode里把这个key删除

        • 你现在把这个key当前的freqNode里删除之后,有没有可能当前的freqNode里就没有任何key了?

        • 如果空了,我们就要连着这个FreqNode + Map删除

  • getMaxKey()

    • 从tailNode里随便拿一个

  • getMinKey()

    • 从headNode里随便拿一个

Last updated