電源ボタンを押すと、最も基本的なリスト(配列)、文字列操作、よく使用されるコレクション、スタック、キュー(deque)、ハッシュテーブル、ヒープ5の補助データ構造の問題解決に加えて、以下の詳細な説明があります。これらのデータ構造の主な特徴、およびpythonでの使用法。
各データ構造メソッドの時間計算量:https:
//blog.csdn.net/weixin_44414948/article/details/113934407
1.セット
原則:数学の授業で学んだ集合概念です。コレクション、ユニオン、違いがあります。構成は繰り返されません。。。
特徴:
1.障害
2.決定論(プログラミング中に添え字にアクセスしたり要素を変更したりすることは許可されていません)
3。非反復性(通常はリストの重複排除に使用されます)
Pythonの実装:
# 定义
s = set()
# 增,用法类似于list.append()
s.add()
# 删
s.pop(1) # 删除指定索引的元素,不传参则随机删除一个
s.remove(x) # 删除指定值的元素,必须传参
s.clear() # 清空set
s.discard() # 和remove类似,不传参不会报错
# 改
# 和字符串一样,不允许中途修改元素的操作,不支持下标索引的方式
s[0] # 这类的操作是不允许的
# 查
for s_i in s: # 使用for in 形式遍历,下标的遍历不允许
# 逻辑运算
s1 & s2 # 求两集合的交集
s1 | s2 # 求两集合的并集
s1 - s2 # 求两集合的差集
使用法:リストを重複排除します
A = [1, 3, 2, 3, 2, 4, 5, 6]
A = set(A)
print(A) # 结果为去重后的A,即[1, 3, 2, 4, 5, 6],顺序随机
例えば:
電源ボタンのブラッシングに関する質問:448。配列内の欠落しているすべての数値を検索します(差分メソッドを設定します)
https://blog.csdn.net/weixin_44414948/article/details/113803271
2.スタック
原則:
スタックは本質的にコンテナであり、リストのように要素を格納します。
機能:
先入れ先出し、後入れ先出し(キューではなく)
Pythonの実装:
スタックはリストに非常に似ているため、質問をブラッシングするときにリストをスタックとして使用し、pop()メソッドを使用してスタックをポップし、append()メソッドを使用してスタックをプッシュできます。これらのブラッシングの質問に熟練するのに十分です。
# 定义
stack = [1, 2, 3, 4]
# 入栈
stack.append(5)
# 出栈
stack.pop() # 默认删除最后一个元素,即最后入栈的 5
例えば:
電源ボタンのブラッシングに関する質問:20。有効なブラケット(照合にはスタックを使用)
https://blog.csdn.net/weixin_44414948/article/details/114088834
3.キュー(deque \ queue)
原則:
実際のキューイングと同様に、その要素は人々が並んでいるように見ることができます。
特徴:
先入れ先出し、先入れ先出し、先入れ先出し(両端キューの両側に出入りできます)
Pythonの実装:
通常、コレクションライブラリの両端キューdequeを使用して、エンキューおよびデキュー操作をマスターします。
import collections
# 定义
queue = collections.deque()
# 入队
queue.append(1) # 在队列右侧加入
queue.appendleft(2) # 在队列左侧加入
# 出队
queue.pop() # 右侧出队
queue.popleft() # 左侧出队
例えば:
1. Likouブラッシングの質問:101。対称二分木(キュー)
https://blog.csdn.net/weixin_44414948/article/details/113748957
2. Likouブラッシングの質問:剣はオファー32-IIIを指します。上から下に印刷バイナリツリーIII(単純なリスト、キュー)
https://blog.csdn.net/weixin_44414948/article/details/113783424
4.ハッシュテーブル(ハッシュマップ)
原則:
キー値に基づいて直接アクセスされるデータ構造。つまり、キーコード値をテーブル内の場所にマッピングしてレコードにアクセスし、検索を高速化します。Pythonの辞書辞書です。
特徴:
キーと値のペアで検索でき、検索速度が速く、効率が高くなります。
Pythonの実装:Pythonに
付属するdictの基本的なデータ型はハッシュテーブルです。通常、組み込みのdict()は質問を書くときに使用されませんが、collections.defaultdict()が使用されます。これは、主にライブラリでは、存在しないキーで要素を追加できます。辞書の基本的な操作方法は次のとおりです。
defaultdictの真の意味は、一種のグローバル初期化を実現します。どのキーにアクセスしても、KeyError例外はスローされません。defaultdict
(int):0に初期化
defaultdict(float):0.0に初期化
defaultdict(str):”
defaultdict(list)に初期化:[]に初期化されます。これは、質問をブラッシングするときに最も一般的に使用されるリストです。
# 定义
import collections
s = [('yellow',1),('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = collections.defaultdict(list)
for k, v in s:
d[k].append(v) #将【值v】加入进【字典d】的【键k】中
a=sorted(d.items()) #排序
print(a)
例えば:
1. Likouブラッシングの質問:697。配列の程度(クラシックハッシュテーブルの質問)
https://blog.csdn.net/weixin_44414948/article/details/113881244
2. Likouブラッシングの質問:1128。同等のドミノペアの数量(ハッシュテーブル+順列と組み合わせ)
https://blog.csdn.net/weixin_44414948/article/details/113177535
5.ヒープ
原則:
スタックは後入れ先出しのデータ構造であり、ヒープはソートされたツリー型のデータ構造であり、各ノードには値があります。
特性:
ヒープの特性は、ルートノードの値が最小(または最大)であり、ルートノードの2つのツリーもヒープであるということです。ヒープのこの特性のため、優先キューを実装するためによく使用されます。
質問を書いている私たちにとって、ヒープはそれ自体で自動的にソートできるデータ構造であることを知っておく必要があります。組み込みのaddおよびpopメソッドに興味のある学生は、の下部を見ることができます。拡張された知識。
Pythonの実装:
質問をブラッシングするには、ヒープの特性に精通している必要があるだけで、Pythonヒープの定義、追加、および削除を使用できます。
Pythonのheapqライブラリを使用してヒープを定義します。
import heapq
# 将列表转为堆
L1 = [4, 5, 1, 6, 2, 7, 3, 8]
heapq.heapify(L1)
# 堆添加元素
h = []
heapq.heappush(h, 6) # 注意此处 h 为列表
# 堆删除最小元素,即最上面的元素
L1 = [4, 5, 1, 6, 2, 7, 3, 8]
heapq.heapify(L1)
heapq.heappop(L1)
例えば:
電源ボタンブラシの質問:5638。リンゴの最大数(ヒープ、この質問を積み上げるのは難しくありません)
https://blog.csdn.net/weixin_44414948/article/details/111824441
以下は、ヒープに関する拡張知識です。
—————————————————————————————————
ヒープに要素を追加し、自動的にソートする手順を次の図に示します。目標は、ヒープ内の新しい要素に適した場所を見つけて挿入することです。次のように実行します。
(1)最初にヒープの一番下に要素を挿入します。配列の実装では、これは配列の最後の要素の後の位置です
—————————————————— ———— ————————————
(2)次に、新しい要素の値がその親ノードの値よりも小さい限り、ループに入ります。ループは新しい要素を許可します。要素はヒープを「ウォーク」し、新しい要素を移動します。要素はその親ノードと交換します。このプロセスが停止すると(新しい要素がその親ノード以上であるか、最上位ノードに到達した場合)、新しい要素は適切な位置にあります。
組み込みのadd要素add()のコードは次のとおりです。
def add(self, item):
self._size += 1
self._heap.append(item)
curPos = len(self._heap) - 1
while curPos > 0:
parent = (curPos - 1) // 2
parentItem = self._heap[parent]
if parentItem <= item:
break
else:
self._heap[curPos] = self._heap[parent]
self._heap[parent] = item
curPos = parent
削除操作ポップ:削除
の目的は、ルートノードを削除した後にノード内の要素を返し、ヒープ属性を維持するように他のノードの位置を調整することです。削除操作の戦略は次のとおりです。
(1)まず、一番上の要素と一番下の要素のポインタをヒープに保存し、要素をヒープの一番下から一番上に移動します
————————————————— ————— ————————————
(2)パイルの上部から下に移動し、最小の要素をパイルの下部に到達するまで1層上に移動します。
組み込み要素pop()のコードは次のとおりです。
def pop(self):
if self.isEmpty():
raise Exception("Heap is empty")
self._size -= 1
topItem = self._heap[0]
bottomItem = self._heap.pop(len(self._heap) - 1)
if len(self._heap) == 0:
return bottomItem
self._heap[0] = bottomItem
lastIndex = len(self._heap) - 1
curPos = 0
while True:
leftChild = 2 * curPos + 1
rightChild = 2 * curPos + 2
if leftChild > lastIndex:
break
if rightChild > lastIndex:
maxChild = leftChild;
else:
leftItem = self._heap[leftChild]
rightItem = self._heap[rightChild]
if leftItem < rightItem:
maxChild = leftChild
else:
maxChild = rightChild
maxItem = self._heap[maxChild]
if bottomItem <= maxItem:
break
else:
self._heap[curPos] = self._heap[maxChild]
self._heap[maxChild] = bottomItem
curPos = maxChild
return topItem
知識を拡大するための参照ソース:https://blog.csdn.net/dta0502/article/details/80834787