第五に、順位表

 

 

配列表の基本的な形式、データ記憶素子自体連続し、同一の固定のメモリセルを共有の各要素の大きさを示す図、その論理アドレスと記憶素子(実際のメモリアドレス)の物理アドレスの標準的な要素であることができますメモリセル領域に記憶された開始アドレスによって論理アドレス(i番目の要素)を追加するサイズ(c)の生成物をから算出されます

したがって、指定された要素にアクセスするときにはその時間複雑さに対応するアドレスを計算することによって得ることができ、最初から横断する必要はありませんO(1)です。

素子の大きさが均一でない場合、B図を採用するために必要な外部要素の形態、実際のデータ記憶素子それぞれのセル位置テーブルに別々に、順次対応する要素の(すなわち、リンク)アドレス情報を保持します。

インデックステーブルにこの順に図Bはまた、最も単純なインデックス構造であり、実際のデータと呼ばれます。

シーケンステーブルの構造

完全な情報テーブルの配列は二つの部分、要素のテーブルセット、適切な動作のための他の一部を含み、情報を記録するために、容量素子の記憶領域を含む情報の一部であるテーブル上の全体的な状況、約すなわち、情報その数、すでに現在のテーブル内の2つの要素を。

 

テーブル二つの配列基本的方法

 

 

図は、一体構造、記憶領域に配置された連続的にテーブル情報を格納するための要素単位記憶領域として、2つの部分が一体的に完全なデータシーケンステーブルオブジェクトを形成します。

統合された構造的完全性と強力な、管理しやすいです。しかしながら、データ要素の記憶領域の一部が表オブジェクトであるため、順序テーブルが作成され、固定要素上の記憶領域。

パネルbは、別個の構造、テーブル全体に関連する情報のみ(すなわち、容量及び要素の数)に格納されたオブジェクトテーブルは、別個に別の要素の記憶領域に格納された実際のデータ要素は、オブジェクトを関連付けることにより、ベーステーブルとリンクされています。

要素の記憶領域を交換してください

一緒にシーケンシャルテーブル情報記憶領域と連続データ領域に一体構造、データ領域の交換したい場合、あなただけの全体を移動させることができるが、すなわち、全体の標的配列テーブル(シーケンステーブルの記憶領域の構成情報を参照して)変化しています。

データリンクアドレスエリアを更新するだけの情報テーブル領域、別々の構造データ領域を交換し、そのままこの順序テーブルオブジェクトに。

ストレージエリア拡大の要素

采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行。人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。

扩充的两种策略

  • 每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。

    特点:节省空间,但是扩充操作频繁,操作次数多。

  • 每次扩充容量加倍,如每次扩充增加一倍存储空间。

    特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。

 

顺序表的操作

增加元素

如图所示,为顺序表增加新元素111的三种方式

 

 

a. 尾端加入元素,时间复杂度为O(1)

b. 非保序的加入元素(不常见),时间复杂度为O(1)

c. 保序的元素加入,时间复杂度为O(n)

删除元素

 

 

a. 删除表尾元素,时间复杂度为O(1)

b. 非保序的元素删除(不常见),时间复杂度为O(1)

c. 保序的元素删除,时间复杂度为O(n)

Python中的顺序表

Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。

tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。

list的基本实现技术

Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:

  • 基于下标(位置)的高效元素访问和更新,时间复杂度应该是O(1);

    为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。

  • 允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变。

    为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。

在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。

在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

おすすめ

転載: www.cnblogs.com/oliver3455/p/11440349.html