算法学习(2)--数组、链表和跳表的基本实现与特性
发布日期:2022-02-10 11:37:00
浏览次数:52
分类:技术文章
本文共 543 字,大约阅读时间需要 1 分钟。
一、数组
- 数组是一段连续地址的内存,使用内存管理器(memory controller)访问,访问的时间复杂度为O(1)。
- 增(删)元素:插入(删除)一个元素,该位置后元素全部后移(前移),时间复杂度为O(n)。
- 数组扩张时,如果原有内存大小不能满足需求,则开辟一块原来大小两倍的内存,用以复制旧数组。
二、链表
- node,有单链表、双向链表、循环链表,pHead/pTail/构造函数。
- 增删不涉及群移操作,移动和修改操作的时间复杂度为O(1)。
- 访问元素节点的时间复杂度为线性复杂度O(n)。
- LRU cache利用链表。
三、跳表
- Skip List,只能用于元素有序的情况。
- 跳表对标的是平衡树AVL和二分查找,是一种插入/删除/搜索都是O(logn)的数据结构。
- 优势是原理简单、容易实现、方便拓展、效率高,在一些热门的项目中来替代平衡树,如Redis,LevelDB(Google,Jeff Dean)
- 跳表是一维数组升维实现的,在思考提升链表插座的效率的过程中,原链表如下:
建立第一级索引:
建立第二级索引:
建立多级索引:
5. 现实中跳表的形态
6.跳表查找的时间复杂度为O(logn);增加和删除需要维护更新索引,时间复杂度为O(logn),空间复杂度为O(n)。
转载地址:https://blog.csdn.net/Fan_z_0802/article/details/107828761 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月02日 18时28分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CFSSL: 证书管理工具:5:理解CSR文件内容
2019-04-27
CFSSL: 证书管理工具:6:理解证书文件内容
2019-04-27
Android应用构建:9:使用keytool创建APK文件使用的keystore
2019-04-27
Android应用构建:10:使用sdkmanager管理sdk
2019-04-27
Gradle进阶:6:结合容器进行构建
2019-04-27
Gradle基础:13:使用本地文件方式的gradlew
2019-04-27
Android应用构建:11:使用sdkmanager安装Android SDK
2019-04-27
Android应用构建:12:使用gradle wrapper进行APK文件构建
2019-04-27
Android应用构建:13:使用sdkmanager自动接受license的方法
2019-04-27
Android应用构建:14:构建Android SDK的自定义镜像
2019-04-27
Android应用构建:15:使用gradlew和Android SDK镜像构建安卓应用
2019-04-27
Android应用构建:16:使用gradle和Android SDK镜像构建安卓应用
2019-04-27
实例学习Ansible系列(18)服务管理的几种方式
2019-04-27
实例学习Ansible系列(19)drop-if-exist不出错的写法
2019-04-27
实例学习Ansible系列(20)retry + sleep的常见写法
2019-04-27
实例学习Ansible系列(21)从标准输出获取循环的列表
2019-04-27
Kubernetes 1.17 正式发布:22项功能改进
2019-04-27
Easypack: 使用Ansible快速部署Kubernetes集群
2019-04-27
kubenertes 1.17集群部署总结
2019-04-27
持续集成之企业微信通知:1:群机器人使用方法介绍
2019-04-27