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


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


思路:

设计结构  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)

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

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

因而时间复杂度比较小




具体代码实现:

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

节点结构:



观察列表内容:





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值