当前课程知识点:数据结构(上) > 第三章 列表 > (a)接口与实现 > 03A-3 从秩到位置
我们知道向量的特点
在于它所特有的那种循秩访问的方式
也就是说 根据任何一个元素的秩
它都可以借助这么样一个
简单的线性表达式
在常数的时间内
找到这个元素所存放的物理地址
并且进而对它进行访问
如果要比喻下的话
这种方式很像是 此前更流行的
邮递员来投寄邮件的那种做法
比如说 在某个城市
某个区的某个街道
如果所有的住户
我们认为他们构成一个向量的话
那么邮递员可以根据门牌号
直接地换算出
这个住户在这个街道上
具体的地理位置
这种方式的诱人之处
在于它的效率非常的高
那么这种方法可否被列表所沿用呢?
列表既然与向量一样
是同属于线性结构的
当然它也存在秩的概念
正像我们刚才所说的
其中的每一个元素
都确实在逻辑上
具有一个序号 也就是秩
所以从理论上讲
确实可以通过这个秩进行定位
比如说 我们可以记下
rank到底是多少
然后从头出发
不断地沿着后继引用
向前走rank r那么多步
最终抵达你所需要查找的那个元素
然而此时和向量的情况已经大不相同
继续沿用这种循秩访问的方式
成本会很高
不难看出 刚才这样的一种
循序访问的机械方式
所需要的成本实际上是和秩有关系的
秩越大 相应的访问成本也就越高
而不是保持一个常数
实际上 在这种场合
或者这种情形下
我们在设计相应的算法时
应该尽可能地摒弃掉循秩访问的方式
而是改为所谓的循位置访问的方式
也就是call by position
因为这个时候我们可以认为
列表中的任何一个元素
在物理上都是由一个抽象的位置
也就是position来指定的
相应地 我们也就可以把
整个问题尽可能地转化为
在这些节点与节点
尤其是相邻节点之间的
相互引用、相互访问
这么样的一个过程
从而发挥列表这种结构的优势
避免它的短处
这样一种访问方式
可以用人际网络来很好地形容和比喻
比如说 我们如果要找到某个人
往往不是直接能够得到他的住址
而是通过一些人际之间两两的关系
比如说 朋友的亲戚以及亲戚的同事
或者同事的战友
以及战友的
没准是邻居或者是同学
直到最后才能够找到
你所要找到的数据对象
接下来 我们就来讲解
如何具体地实现这样一种结构
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验