アルゴリズムを理解するパート 2 - シーケンス テーブル

アルゴリズムを理解するパート 2 - シーケンス テーブル

[[407946]]

この記事はWeChatの公開アカウント「Front-end Gravitation」から転載したもので、著者はYichuanです。この記事を転載する場合は、Frontend Gravity の公開アカウントにご連絡ください。

序文

開発において、配列はよく扱うデータ型ですが、その内部の格納構造はどうなっているのでしょうか?詳しく紹介します。

リニアテーブル

線形リストは、最も基本的かつ最も単純で、最も一般的に使用されるデータ構造です。線形リストは、同じ特性を持つ n 個のデータ要素の順序付けられたシーケンスです。

先行要素: 要素 A が要素 B の前に来る場合、A は B の先行要素と呼ばれます。

後続要素: 要素 B が要素 A の後にある場合、B は A の後続要素と呼ばれます。

線形テーブルの分類: 線形テーブル内のデータ保存方法は、シーケンシャル保存とリンク保存に分けられます。

  • シーケンシャル ストレージは、連続したアドレスを持つ一連のストレージ ユニットを使用して、線形リストのデータ要素を順番に格納します。
  • チェーンストレージとは、不連続なアドレスを持つストレージユニットにデータを保存し、ノードを使用してアドレスを接続して照会することです。

ランダム アクセス: 線形リストは連続したメモリ位置に格納されるため、インデックスを通じてメモリ アドレスを計算し、データにランダムにアクセスできます。

シーケンステーブル

シーケンシャルリストの格納方法は、実際にはメモリ内の空き位置を見つけてそこを占有し、その空き位置にデータ要素を 1 つずつ格納するというものです。

配列の構造に少し似ているように聞こえますか? はい、データは線形テーブル構造です。したがって、配列を使用して連続リストを表すことができます。線形リスト内の論理的に隣接するデータ要素は、隣接する物理ストレージ ユニットに格納されます。つまり、データ要素間の論理的な隣接関係は、データ要素の物理ストレージの隣接関係によって反映されます。

配列の長さは線形リストのストレージ スペースの長さであり、この量は通常、ストレージの割り当て後も変更されません。線形リストの長さは、線形リスト内のデータ要素の数です。この量は、線形リスト内で挿入および削除操作が実行されるたびに変化します。覚えておいてください、線形リストの長さは常に配列の長さ以下である必要があります。

  1. クラスSequenceList{
  2.   
  3. コンストラクタ(){
  4. // 要素を格納する配列
  5. this.elemList = [];
  6. // 現在のシーケンスリスト内の要素数
  7. this.elemLength = 0;
  8. }
  9. // 線形テーブルを空のテーブルに設定する
  10. クリア(){
  11. this.elemLength = 0;
  12. }
  13. // 現在の線形テーブルが空のテーブルかどうかを判定します
  14. 空です(){
  15. this.elemLength === 0を返します
  16. }
  17. // 現在の線形テーブルの長さを取得します
  18. 長さ(){
  19. this.elemLengthを返します
  20. }
  21. // 線形リストに要素を追加する
  22. 挿入(要素){
  23. this.elemList[this.elemLength++] = elem;
  24. }
  25.  
  26. // i番目の要素に要素 elem を挿入する
  27. 挿入インデックス(i,要素){
  28. // まず、インデックス位置 i の要素とそれ以降の要素を 1 つずつ後方に移動します
  29. for (let index = this.elemLength - 1; index > i; index --) {  
  30. this.elemList[インデックス] = this.elemList[インデックス-1];
  31. }
  32. // インデックス位置 i の elem 要素を格納します
  33. this.elemList[i] = elem;
  34. }
  35.  
  36. // 指定された位置iの要素を削除した後、要素を返す
  37. 削除(i){
  38. //インデックス i の値を記録する
  39. 現在のものを this.elemList[i] とします。
  40. // インデックス i の後の要素を 1 つずつ前方に移動します
  41. for (let index = i; index < this.elemList - 1; index ++) {
  42. this.elemList[インデックス] = this.elemList[インデックス+1];
  43. }
  44. // 要素数 - 1
  45. this.elemLength --;  
  46. 戻る 現在;
  47. }
  48.  
  49. // シーケンスリスト内の elem 要素の最初の位置を検索します
  50. インデックスOf(要素){
  51. ( i = 0 とします; i< this.elemLength; i++){
  52. if (this.elemList[i] === elem) {
  53. iを返します
  54. }
  55. -1 を返します
  56. }
  57. }
  58. }

配列の利点と欠点

アドバンテージ:

  • メモリスペースの高利用率
  • 要素のインデックスによるアクセス、要素のクエリの効率が高い

欠点:

  • 要素の挿入と削除は非効率的です。 (配列の途中で要素を挿入または削除する場合は、要素を操作して順序を変更する前に、テーブル全体を移動する必要があります)
  • スペースの長さには制限があり、線形テーブルの長さを拡張することはできません。 (アクセス要素の長さがシーケンス リスト内の要素数より大きい場合、「オーバーフロー」が発生します。要素の長さが事前に割り当てられたスペースより小さい場合、スペースが大幅に無駄になります)

まとめ

この記事は、「アルゴリズムを理解する」シリーズの第 2 回目です。主に線形リストの 1 つ目のタイプのシーケンシャル ストレージについて説明し、シーケンシャル ストレージの実装方法を紹介します。

<<:  AI はどのようにしてソフトウェアおよびハードウェア製品のイノベーションを実現するのでしょうか? Baidu Brain オープンデー 西安駅の暗号解読

>>:  2021年なのに、出会い系アプリのアルゴリズムはなぜこんなにも悪いのでしょうか?

推薦する

公正な AI システムを構築するにはどうすればよいでしょうか?

人工知能はあらゆる業界の企業で急速に導入されており、企業は今後 3 年間で AI システムへの支出を...

自動運転のテストが加速:北京と上海が重要なニュースを発表

2018 年後半には、自動運転とインテリジェント コネクテッド ビークルの市場が活況を呈しました。昨...

人工知能の活発な発展は、ホストのような人々が将来的に職を失うことを意味する。

仮想ホスト[[427210]]科学技術の急速な発展に伴い、多くのハイテク製品が私たちの生活に登場して...

...

この記事を読んで人工知能を始めましょう!

今、テクノロジーの世界で最もホットなものは何ですか?答えはおそらく人工知能、機械学習、ディープラーニ...

人工知能向け開発言語5つを比較するとどれが優れているのか?

我が国の人工知能は近年急速に発展しており、顔認識や医療など多くの分野で優れた成果を上げています。しか...

...

...

AIは急速に変化しています。コンピュータービジョンの未来はどこにあるのでしょうか?

著者: 張傑[51CTO.com からのオリジナル記事]コンピューター ビジョン (CV) は、人工...

...

2019 AIIA開発者会議記者会見が北京で開催

10月10日、2019 AIIA人工知能開発者会議の記者会見が北京で開催されました。 2019年AI...

IT プロフェッショナルが CIO に人工知能について知ってほしい 9 つのこと

[51CTO.com クイック翻訳] 最高情報責任者 (CIO) と IT リーダーは、人工知能の実...