抽象数据类型

研究一个简单的数据结构,先定义为抽象数据类型,然后看可能的实现方式。

列表的 ADT 定义(只定义要存的数据和可用的操作)

list

  • store a given number of elements of a given data-type(隐含了静态,数量在创建之前已经直到)

  • 能写或修改任意位置的元素

  • 能读特定位置的元素

数组具备以上所有特性,涉及到编程细节了

int a[10];
a[i] = 2;
printf("%d", a[2]);

数组是一个具有以上特性的列表。

现在想要一个具有更多特性的列表以应对更多的情况。重新定义一个动态长度的 ADT

  • 空列表的长度为 0 (empty list has size 0)

  • 可以向任意位置插入列表

  • 可以移除元素

  • 能计算列表中元素数量

  • 读取/修改指定位置的元素

  • 指定列表的数据类型

可以基于数组实现这样一种数据结构,只不过需要实现更多的操作以提供这些功能。

插入和删除伴随着元素的移动。

更多的细节考虑:数组的规模,数组满的情况下需要有应对策略,需要将其纳入设计之中。数组长度是无法扩展的,那就得创建一个更大的数组,并将上一个数组的内容完整的复制过去。

问题是新数组的大小应该是多少?一个简单的策略,上一个数组长度 * 2。而且是也是一个最佳策略。

复制的过程需要花很多时间,一个良好的实现应该考虑避免这么大的开销。

此外还要研究操作花费的时间成本。

  • 读写花费恒定时间,O(1)

  • 末尾花费时间 O(1)

  • 任意位置插入最坏情况 O(n)

  • 删除也是 O(n)

如果数组已满,插入元素的时间 O(n),最坏情况

这种实现方式子啊内存方面效率不高。

最后更新于