前言
数据结构是指数据间存在的关系,通常包含三个方面。数据的逻辑结构(线性结构、树、图),数据的存储结构(顺序存储和链式存储),数据操作(对数据结构中的元素进行各种运算和处理),而通常所说的算法是建立在数据结构之上,读数据结构的操作需要用算法来描述。而算法的分析又主要包括时间代价和空间代价两方面
线性表的顺序表示和实现
数组是顺序存储的随机存取结构,占用一组连续的存储单元,通过下标识别元素,元素地址是下标的线性函数,一个下标能唯一确定一个元素
不妨构造一个顺序表接口类来模仿顺序表
下面是其实现类
约瑟夫环问题
问题描述:古代某法官要判决n个犯人的死刑,他有一条荒唐的法律:将犯人站成一个圆圈,从第s个人开始数起,每数到第d个犯人,就拉出来处决,在从下一个开始数d个,数到的人在处决。。。直到数到最后一个人就开始赦免
上面是假设n=5,s=1,d=2,并且起始位置是从第一个人开始数起,因为该圆圈可以看成顺序表进行模拟
结果
初始化约瑟夫环:(5,0,2)
删除B(A,C,D,E)
删除D(A,C,E)
删除A(C,E)
删除E(C)
最后的被赦免者是:C
顺序表的效率分析
由之前的源码易看出,存取任何一个元素,即set()、get()方法的时间复杂度为O(1),而插入或者删除很耗时,不妨假设在第i个位置插入元素,并且概率为p{i},表长度为n;则平均移动次数为\sum{i=0}^n{(n-i)}*{p_i};
如果插入元素的概率相同,即都是1/(n+1);最后求得时间复杂度为O(n);同理删除的时间复杂度也为O(n);
所以得出一个结论:顺序表的动态操作效率极低
顺序表比较相等
首先简单说一下深拷贝和浅拷贝,浅拷贝类似于只引用某个对象,和原对象指向相同的空间,而深拷贝是开辟了新空间并且复制原来对象的数据
而两个顺序表的相等是指,他们对应的元素相等并且长度也相同