本論文では、言い換えは、元の作者に属します
1976年、スイスのコンピュータ科学者は、本を書いた「アルゴリズム+データ構造=プログラム」。すなわち:アルゴリズム+データ構造=プログラム。40年後、この式はまだ保持しています。
コード面の質問の多くは、あなたが大学のコンピュータサイエンスやプログラミングの訓練機関、あなたが経験をプログラミングしているどのように多くの年に関係なくから来るかどうか、データ構造の候補の深い理解が必要です。時々、顔の質問には直接のようなデータのような構造を、「私のバイナリツリーの実現を与える、」時にはそれほど明白ではない、言及した「本を書くために、各執筆者の数に関する統計情報を。」
データ構造は何ですか?
データ構造は、コンピュータに格納され、データが編成されています。(そのようなアレイのような)特定のデータ構造のために、いくつかの非常に高い動作効率(配列要素を読み出す)いくつかの操作の、低効率は(配列要素を削除します)。プログラマーの目標は、現在の問題のために最適なデータ構造を選択することです。
なぜ我々は、データ構造が必要なのでしょうか?
データは、プログラムのコア要素であるため、データ構造の値は自明です。どんなにどのようなプログラムあなたしている書き込みは、あなたは、このような従業員の給与、株価、食料品のリストや電話帳などのデータを扱う必要があります。異なるシナリオの下では、データのニーズが特定の方法で保存されるように、私たちは私たちのニーズを満たすために異なるデータ構造を持っています。
一般的なデータ構造の8種類
- 配列
- スタック
- キュー
- リスト
- マップ
- ツリー
- プレフィックスツリー
- ハッシュテーブル
1.アレイ
アレイ(配列)は、おそらくの最も単純で最も一般的に使用されるデータ構造です。そのようなスタックやキューなどの他のデータ構造は配列によって導出されています。
次の図は、4つの要素を持つ配列を示します。
添字または索引(インデックス)と呼ばれるデジタル数によって各配列要素の位置。配列の最初の要素のインデックスは0ほとんどのプログラミング言語です。
区別寸法、二つの異なる配列があります。
- (上記のように)一次元アレイ
- 多次元配列(配列の配列要素)
アレイの基本操作
- 挿入 - インデックスに要素を挿入します
- ゲット - 要素のインデックスを読みます
- インデックスにある要素を削除する - 削除
- サイズ - 配列の長さを取得します。
コード面の質問の共通配列
2.スタック
取り下げ、であることは、Ctrl + Zは、私たちの最も一般的な操作の一つは、ほとんどのアプリケーションは、この機能をサポートします。あなたはそれを達成する方法を知っていますか?答えはこれです:前のアプリケーションの状態(制限数は)最初の一つに、メモリに最新の状態を保存しました。この時点で、我々は、この機能を実現するためにスタックに(スタック)が必要です。
LIFO(最後にファーストアウト)を使用してスタック要素、即ちLIFO。
それが最初に削除されるように、図下側のスタックは、上部の三つの要素3を有します。
スタックの基本的な操作
- プッシュ - 挿入要素のスタックの最上位
- ポップ - スタック要素の先頭に戻り、それを削除
- isEmpty - スタックが空であるかどうかを問い合わせ
- トップ - スタック要素のトップに復帰、削除されていません
一般的なスタックコードフェイス質問
3.キュー
待ち行列(キュー)がスタックに類似して、データを格納する線形構造です。違いは、FIFOキューを使用している間、すなわち、FIFO(ファースト・アウトの最初)、LIFOスタックモードを使用して、ということです。
図に示す次のキュー、最上位要素1は、それが最初に除去されます。
キューの基本的な操作
- エンキュー - 要素はキューの末尾に挿入されています
- デキュー - 削除するキューの最初の要素
- isEmpty - クエリのキューが空であります
- トップは - キューの最初の要素を返します。
コード共通キューフェイス質問
4.リスト
一覧(リンクリスト)も直鎖状構造である、それは非常に多くの配列のように見えますが、そのメモリ割り当て、内部構造と挿入または削除操作は同じではありません。
チェーンリストは、一連のノード、各ノードのデータを格納し、次のノードを指すポインタから構成されています。最初のノードにリスト先頭ポインタリストが空の場合、ヘッドポインタが空またはnullです。
リストは、ファイルシステム、ハッシュテーブルと隣接テーブルを実装するために使用することができます。
次の図は、3つのノードを持つリンクリストを、示しています。
リストは2種類に分かれています。
- 单向链表
- 双向链表
链表的基本操作
- InsertAtEnd — 在链表结尾插入元素
- InsertAtHead — 在链表开头插入元素
- Delete — 删除链表的指定元素
- DeleteAtHead — 删除链表第一个元素
- Search — 在链表中查询指定元素
- isEmpty — 查询链表是否为空
常见的队列代码面试题
5. 图
图(graph)由多个节点(vertex)构成,节点之间阔以互相连接组成一个网络。(x, y)表示一条边(edge),它表示节点 x 与 y 相连。边可能会有权值(weight/cost)。
图分为两种:
- 无向图
- 有向图
在编程语言中,图有可能有以下两种形式表示:
- 邻接矩阵(Adjacency Matrix)
- 邻接表(Adjacency List)
遍历图有两周算法
- 广度优先搜索(Breadth First Search)
- 深度优先搜索(Depth First Search)
常见的图代码面试题
6. 树
树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。
树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。
下图是一个简单的树以及与树相关的术语:
树有很多分类:
- N 叉树(N-ary Tree)
- 平衡树(Balanced Tree)
- 二叉树(Binary Tree)
- 二叉查找树(Binary Search Tree)
- 平衡二叉树(AVL Tree)
- 红黑树(Red Black Tree)
- 2-3 树(2–3 Tree)
其中,二叉树和二叉查找树是最常用的树。
常见的树代码面试题
7. 前缀树
前缀树(Prefix Trees 或者 Trie)与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至 IP 路由。
下图展示了“top”, “thus”和“their”三个单词在前缀树中如何存储的:
单词是按照字母从上往下存储,“p”, “s”和“r”节点分别表示“top”, “thus”和“their”的单词结尾。
常见的树代码面试题
8. 哈希表
哈希(Hash)将某个对象变换为唯一标识符,该标识符通常用一个短的随机字母和数字组成的字符串来代表。哈希可以用来实现各种数据结构,其中最常用的就是哈希表(hash table)。
哈希表通常由数组实现。
哈希表的性能取决于 3 个指标:
- 哈希函数
- 哈希表的大小
- 哈希冲突处理方式
下图展示了有数组实现的哈希表,数组的下标即为哈希值,由哈希函数计算,作为哈希表的键(key),而数组中保存的数据即为值(value):