![](https://csdnimg.cn/release/download_crawler_static/86304434/bg4.jpg)
13 if ( pos == 0 )
14 {
15 ListInsert( Lc, j, bi );
16 j++;
17 } //end if ( pos == 0 )
18 i++; // 依次向后取一个元素
19 } //end while
20 } //end FindNewCity
CD "#$ 查找小明去过但小文没去过的城市
可见,将一个实际问题在计算机中进行表示和解决,有两个要点:一是选择合适的数据结构
进行表示;二是基于该数据结构的基本操作,设计相关算法步骤解决问题。上例中,选择线性表
结构进行表示,通过一系列基本操作的组合解决了该问题。需要注意的是,算法的设计也是从关
键步骤的推导开始,逐步完善的。上例可以看出,先抓住问题的本质是 的操作,
首先用 3 个步骤实现最核心的解决方法,然后再逐步完善整个算法描述。这提供了算法设计的通
常思路,并不是从头至尾一行一行顺序写出来的,而是从核心步骤开始,逐步向外扩展出来的。
我们不能止步于此,还需要分析一下该算法的时间复杂度,并考虑在后续具体实现时的优化
策略。该算法主要有两重循环构成,外层是第 6 行确定的,执行次数是 Lb_len,内层是由第 11 行
确定的,执行次数最多是 La_len,那这个算法总的时间复杂度将为 ,如果两
者的规模都为 的话,则复杂度是 量级。那么如何优化呢?显然问题的重点在第 11 行语句
LocateElem 操作上,如何让查找定位的时间变少。我们可以规定每个城市有一个整数型的城市代
码 CityNo,每个线性表中城市列表按照城市代码的升序排列。这样,就不需要在整个线性表 中
查找,只需从上次查找结束的位置继续向后查找,直至找到相同城市或者后续的城市代码比待查
找城市代码大,即可停止。这样,算法总的时间复杂度可降为 ,成为
量级的。这个优化的例子可以看出数据结构的魅力所在。
!"1$'()*23)4567$
用顺序存储方式实现的线性表称为
顺序表
(Sequential List),它是用一维数组作为其存
储结构的。
!"#"$%&'()*+,-.%
(1)顺序表的定义
顺序表是用一组地址连续的存储空间依次存储线性表的数据元素。顺序表数据元素的地址决
定了它们之间的关系,也就是说,以数据元素在计算机内物理位置的相邻来表示线性表中数据元
素之间的逻辑关系。
(2)顺序表的特点
顺序表的特点如下:
1)各个数据元素的逻辑顺序与其存放的物理顺序一致。
2)对顺序表中所有元素,既可以进行顺序依次访问,也可以进行随机直接访问。
3)顺序表用一维数组实现时,存储空间可以是静态分配的,也可以是动态分配的。
4)顺序表所能存放的数据元素个数受数组的空间大小约束。
以 C/C++代码实现为例,顺序表的存储示意图如下图所示。值得注意的是,在逻辑描述中,我
们从 1 开始,但在 C/C++的数组实现时,下标是从 0 开始的。