设计可以变更的缓存结构:

左(进阶)算法----数据结构自设计 / 跳表


思路:

设计结构  map---储存对应的位置 + 双向链表---维持优先级

左(进阶)算法----数据结构自设计 / 跳表


还有size的限制 ----

如果超过个数限制 ---则将头节点删除 并 从中找到map对应的记录(因为节点中含有map中的key)

将新加入节点连在双向链表后面即可~



代码实现:

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表


设计的缓存结构:

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表



注意:

map  中  存值 具体和数值类型有关

左(进阶)算法----数据结构自设计 / 跳表

map 中  存放 基础类型  则就是具体的值

              存放 自定义类型 基本就只存放地址  不会直接存放值 不太可能~




(once fail ----baidu )

给定一个字符串公式 ,返回公式的计算结果:

左(进阶)算法----数据结构自设计 / 跳表



思路1 (没有小括号的情况) :

将符号和数字均压入同一个栈中

 每次压入一个数字和一个符号  

若 符号是+ 或者-  则直接压入即可

若符号是* / 则弹出 栈中数字和当前数字进行计算之后 再将结果压入

最后 栈 中所有数字均只有 + -  直接计算即可


左(进阶)算法----数据结构自设计 / 跳表



考虑2 :有这样的函数  :

  f(num) 表示从字符串str的第num位置开始计算 如果遇到右括号则直接停止,返回结果

  否则直到str末尾计算 再返回结果即可

左(进阶)算法----数据结构自设计 / 跳表


解法 :当遇到左括号的时候就开始调用子过程 

等子过程将计算值返回时则 继续计算 再返回全局返回值

所以 其实函数返回结果应该是两个:1 计算到哪个位置  2  f(.)计算的返回值

左(进阶)算法----数据结构自设计 / 跳表



代码实现:

pre :收集数字  

如果一直是数字 那就一直读入收集

如果不是左括号和数字(=-/*)    则都分别放入

如果遇到左括号---递归---调用子过程


左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表


举例说明核心代码:

左(进阶)算法----数据结构自设计 / 跳表




跳表(难度大):

能够实现key-vlue其中key 也是有序的  但底层不是红黑树  同样时间复杂度O(logn)

redis底层结构也是跳表 是一种变体


底层原理:

key对应的层数是由随机函数生成(生成结果要不为1 要不为0)

在一个已有的跳表中加入一个新的数字  则如何去找位置?

每次均是从最上面开始查找  而观察分布 发现最下边的层次点数最多 越往上越少

因而时间复杂度比较小

左(进阶)算法----数据结构自设计 / 跳表



具体代码实现:

注意:下一个比当前的要大  则就往下走  否则往右走

节点结构:


左(进阶)算法----数据结构自设计 / 跳表


观察列表内容:

左(进阶)算法----数据结构自设计 / 跳表

左(进阶)算法----数据结构自设计 / 跳表


左(进阶)算法----数据结构自设计 / 跳表


相关文章:

  • 2022-01-05
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
  • 2021-11-18
  • 2021-12-02
  • 2023-01-16
  • 2021-10-25
猜你喜欢
  • 2021-07-01
  • 2021-12-15
  • 2022-02-26
  • 2021-12-20
  • 2021-09-07
  • 2021-12-29
相关资源
相似解决方案