2.配列表のデータ構造とアルゴリズム(パイソン)

2.受注テーブル

プログラムでは、あなたが(通常はいくつかの種類)を管理し、使用して全体としてのデータ要素のセットを必要とする、あなたは、それらの使用の変数、関数を記録し、このグループの要素を作成し、その普及に渡す必要があります。要素の数は、(追加または削除要素)を変更することができるデータのセットに含まれています。

この要求のために、最も簡単な解決策は、実際のアプリケーションに関するいくつかの意味のある情報で表される配列の位置と順に使用される要素のシーケンスとして要素のグループ、または間でデータを表現することです関係。

グループで編成このような配列要素は、我々はとして抽象化することができ、リニアテーブル線形リストには、要素間の連続的な関係の中で記録されている特定の要素のコレクションです。リニアテーブルには、実際の手順が広く使用されている、それは多くの場合、複雑なデータ構造の基礎として使用され、最も基本的なデータ構造の一つです。

ストレージの実際の線形形式は、達成するために、2つのモデルに分かれています。

配列表は、要素を順次連続したメモリ領域に格納され、要素間のシーケンス関係は、それらの天然の格納順序で表さ。

リスト、構成を連結することにより、メモリブロックに格納された要素の数。

2.1配列表形式

シーケンステーブルの基本的な形

配列表の基本的な形態、連続データ記憶素子自体、同じ固定メモリセルシェアの各要素の大きさを示す図、その論理アドレスと記憶素子(実際のメモリアドレス)の物理アドレスの標準的な要素であることができますアドレス格納領域のLoc(E0)を開始することによってプラス論理アドレス(i番目の要素)は、記憶部(C)の大きさとの積を算出するには、すなわち、得られます。

LOC(EJ)= LOC(E0)+ C * J

スクラッチからトラバースする必要がない指定された要素にアクセスする場合したがって、その時間複雑さに対応するアドレスを計算することによって得ることができるO(1)です。

要素の大きさは、図bの要素の外形、テーブルに順次格納されている実際のデータの別個の要素は、各セルの位置をアドレス情報を保持する対応する要素の(すなわち、リンク)を使用する必要が一様でない場合。各リンクに必要な記憶の同じ量が、上記の式は、要素リンクの格納位置から計算され、その後、実際に格納されるデータ要素を検索するためのリンクをたどることができます。図のB、Cは、長いデータ・エレメントのサイズであるが、メモリの量がリンクアドレスを保存するために必要な量は、一般的に小さいことに留意されたいです。

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

2.2アーキテクチャと実装順序テーブル

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

完全な配列情報テーブルは、2つの部分、テーブル内の要素の集合、すなわちデータ領域を備え、他の部分は、ヘッダ情報として知られているテーブルの全体的な状況について適切な動作、すなわち、情報については、記録すべき情報であり、情報要素のこの部分は、記憶領域含む容量と現在のテーブル内の既存の要素の数二つ。

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

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

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

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

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

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

あなたはデータリンクアドレスエリアを更新するだけで、テーブル情報領域、分離型構造にデータ領域を交換し、そのままこの順序テーブルオブジェクトにしたい場合。

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

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

扩充的两种策略:

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

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

​ (2)每次扩充容量加倍,如每次扩充增加一倍存储空间。

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

2.3 顺序表的操作

增加元素

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

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

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

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

删除元素

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

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

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

2.4 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/sincere-ye/p/12153129.html