Pythonプログラム設計のデータ構造
1.ヒープは、各親ノードの値がすべてのサブノードの値を超えない二叉木です.配列またはリストを使用してスタックを実装する場合、すべてのk(下付き、0から)はheap[k]<=heap[2 k+1]およびheap[k]<=heap[2 k+2]を満たし、スタック内の最小要素は常に二叉木のルートノードに位置する.スタックはスタックとも呼ばれ、演算が制限された線形テーブルです.この制限は、テーブルの一端でのみ挿入および削除演算を許可することです.この一端をスタックトップと呼び、反対に他端をスタックベースと呼ぶ.1つのスタックに新しい要素を挿入することは、スタック、スタック、またはスタックと呼ばれ、新しい要素をスタックの上部要素の上に配置し、新しいスタックの上部要素にすることである.
2.キューキューの特徴は、先行先行(FIFO)と後進後出(LILO)である.キューは、テーブルのフロントエンド(front)でのみ削除操作を許可し、テーブルのバックエンド(rear)で挿入操作を行う特殊な線形テーブルであり、スタックと同様に、キューは操作が制限された線形テーブルである.挿入操作を行う端をキューテールと呼び,削除操作を行う端をキューヘッダと呼ぶ.キューに要素がない場合は、空のキューと呼ばれます.
カスタムキュー構造:
上記のコードをmyQueueとして保存する.pyファイル、モジュール作成参照:https://blog.csdn.net/qxyloveyy/article/details/104345359
3.スタックは、先行後出(FILO)または後進先出(LIFO)のデータ構造である.スタック、スタックとも呼ばれ、演算が制限された線形テーブルです.この制限は、テーブルの一端でのみ挿入および削除演算を許可することです.この一端をスタックトップと呼び、反対に他端をスタックベースと呼ぶ.1つのスタックに新しい要素を挿入することは、スタック、スタック、またはスタックと呼ばれ、新しい要素をスタックの上部要素の上に配置し、新しいスタックの上部要素にすることである.スタックから要素を削除することは、スタックまたはバックスタックとも呼ばれ、スタックトップ要素を削除し、隣接する要素を新しいスタックトップ要素にします.スタックは先進的な後出の原則に従ってデータを格納し、先に入ったデータはスタックの底に押し込まれ、最後のデータはスタックの上にあり、データを読む必要があるときにスタックの上からデータがポップアップされる(最後のデータは最初に読み出される).スタックは記憶作用があり、スタックの挿入と削除操作では、スタックベースポインタを変更する必要はありません.Python自体がスタックの基本操作を実現!
4.チェーンテーブルチェーンテーブルは物理記憶ユニット上の非連続、非順序の記憶構造であり、データ要素の論理順序はチェーンテーブル中のポインタリンク順序によって実現される.チェーンテーブルは、実行時に動的に生成できる一連のノード(チェーンテーブルの各要素をノードと呼ぶ)から構成されます.各ノードには、データ要素を格納するデータドメインと、次のノードアドレスを格納するポインタドメインの2つのセクションがあります.線形テーブルの順序構造に比べて、操作が複雑です.順番に格納する必要がないため、チェーンテーブルは挿入時にO(1)の複雑さに達し、別の線形テーブルの順序テーブルよりもずっと速いが、1つのノードを検索したり、特定の番号のノードにアクセスしたりするにはO(n)の時間が必要であり、線形テーブルと順序テーブルの対応する時間複雑さはそれぞれO(logn)とO(1)である.Pythonリストを使ってチェーンテーブルの簡易機能を実現できます!
5.ツリーツリーツリーツリーは、ノードごとに最大2つのサブツリーを持つツリー構造です.通常、サブツリーは「左サブツリー」(left subtree)と「右サブツリー」(right subtree)と呼ばれます.二叉木は、二叉ルックアップツリーと二叉スタックを実現するためによく用いられる.深さkで2^k-1の接点を持つ二叉樹で、満二叉樹と呼ばれています.この木の特徴は,各層のノード数が最大ノード数であることである.一方、1本の二叉木では、最後の層を除いて、残りの層がいっぱいで、最後の層がいっぱいであるか、右側に連続するいくつかの接点が欠けている場合、この二叉木は完全な二叉木である.n個のノードを有する完全二叉木の深さはfloor(log 2 n)+1であった.深さkの完全な二叉木は、少なくとも2 k−1個の葉の結点があり、せいぜい2 k−1個の結点がある.カスタムツリー構造
6.有向図、有向図Dは、秩序化された三元群(V(D)、A(D)を指す.ψD),そのうちψD)は、A(D)の各要素(エッジまたはアークと呼ばれる)をV(D)の秩序化要素(頂点または点と呼ばれる)のペアに対応させる関連関数です.図面構造をカスタマイズします.
その他参考記事:Python開発環境構築:https://blog.csdn.net/qxyloveyy/article/details/104227923Pythonシーケンスは記事を参照してください.https://blog.csdn.net/qxyloveyy/article/details/104391462
あなたに役に立つことを望みます!
import heapq #
import random # random
data=random.shuffle(list(range(10))) #
heap=[] #
for n in data:
heapq.heappush(heap,n) #
heapq.heappush(heap,0.5) #
heapq.heappop(heap) # ,
list=[1,2,3] #
heapq.heapify(list) #
heapq.heapreplace(list,6) # ,
heapq.nlargest(2,list) #
heapq.nsmallest(1,list) #
2.キューキューの特徴は、先行先行(FIFO)と後進後出(LILO)である.キューは、テーブルのフロントエンド(front)でのみ削除操作を許可し、テーブルのバックエンド(rear)で挿入操作を行う特殊な線形テーブルであり、スタックと同様に、キューは操作が制限された線形テーブルである.挿入操作を行う端をキューテールと呼び,削除操作を行う端をキューヘッダと呼ぶ.キューに要素がない場合は、空のキューと呼ばれます.
import queue # (Python3.x queue,Python2.x Queue)
q=queue.Queue()
for i in range(3)
q.put(i) #
>>>q.queue
>>>dqueue([0,1,2])
q.get() #
q1=queue.LifoQueue(5) # ( get() )
q2=queue.PriorityQueue(5) # ( )
カスタムキュー構造:
class myQueue:
def __init__(self, size=10):
self._content=[]
self._size=size
self._current=0
def Setsize(self,size):
if size
上記のコードをmyQueueとして保存する.pyファイル、モジュール作成参照:https://blog.csdn.net/qxyloveyy/article/details/104345359
import myQueue #
q=myQueue.myQueue() #
>>>q.isFull()
>>>False # myQueue ,
3.スタックは、先行後出(FILO)または後進先出(LIFO)のデータ構造である.スタック、スタックとも呼ばれ、演算が制限された線形テーブルです.この制限は、テーブルの一端でのみ挿入および削除演算を許可することです.この一端をスタックトップと呼び、反対に他端をスタックベースと呼ぶ.1つのスタックに新しい要素を挿入することは、スタック、スタック、またはスタックと呼ばれ、新しい要素をスタックの上部要素の上に配置し、新しいスタックの上部要素にすることである.スタックから要素を削除することは、スタックまたはバックスタックとも呼ばれ、スタックトップ要素を削除し、隣接する要素を新しいスタックトップ要素にします.スタックは先進的な後出の原則に従ってデータを格納し、先に入ったデータはスタックの底に押し込まれ、最後のデータはスタックの上にあり、データを読む必要があるときにスタックの上からデータがポップアップされる(最後のデータは最初に読み出される).スタックは記憶作用があり、スタックの挿入と削除操作では、スタックベースポインタを変更する必要はありません.Python自体がスタックの基本操作を実現!
class myStack:
def __init__(self,size=10):
self._content=[]
self._current=0
self._size=size
def empty(self):
self._content=[]
self._current=0
def isEmpty(self):
if not self._content:
return Ture
else:
return False
def isFull(self):
if self._current==self._size:
return True
else:
return False
def setSize(self,size): # ,
if size
4.チェーンテーブルチェーンテーブルは物理記憶ユニット上の非連続、非順序の記憶構造であり、データ要素の論理順序はチェーンテーブル中のポインタリンク順序によって実現される.チェーンテーブルは、実行時に動的に生成できる一連のノード(チェーンテーブルの各要素をノードと呼ぶ)から構成されます.各ノードには、データ要素を格納するデータドメインと、次のノードアドレスを格納するポインタドメインの2つのセクションがあります.線形テーブルの順序構造に比べて、操作が複雑です.順番に格納する必要がないため、チェーンテーブルは挿入時にO(1)の複雑さに達し、別の線形テーブルの順序テーブルよりもずっと速いが、1つのノードを検索したり、特定の番号のノードにアクセスしたりするにはO(n)の時間が必要であり、線形テーブルと順序テーブルの対応する時間複雑さはそれぞれO(logn)とO(1)である.Pythonリストを使ってチェーンテーブルの簡易機能を実現できます!
my_linkTable=[]
for i in range(3):
my_linkTable.append(i) #
my_linkTable.insert(1,4) #
my_linkTable.remove(my_linkTable[2]) #
5.ツリーツリーツリーツリーは、ノードごとに最大2つのサブツリーを持つツリー構造です.通常、サブツリーは「左サブツリー」(left subtree)と「右サブツリー」(right subtree)と呼ばれます.二叉木は、二叉ルックアップツリーと二叉スタックを実現するためによく用いられる.深さkで2^k-1の接点を持つ二叉樹で、満二叉樹と呼ばれています.この木の特徴は,各層のノード数が最大ノード数であることである.一方、1本の二叉木では、最後の層を除いて、残りの層がいっぱいで、最後の層がいっぱいであるか、右側に連続するいくつかの接点が欠けている場合、この二叉木は完全な二叉木である.n個のノードを有する完全二叉木の深さはfloor(log 2 n)+1であった.深さkの完全な二叉木は、少なくとも2 k−1個の葉の結点があり、せいぜい2 k−1個の結点がある.カスタムツリー構造
class BinaryTree:
def __init__(self,value):
self._left=None
self._right=None
self.data=value
def insertLeftChild(self,value): #
if self._left:
print('Left child tree already exists.')
else:
self._left=BinaryTree(value)
return self._left
def insertRightChild(right,value): #
if self._left:
print('Right child tree already exists.')
else:
self._right=BinaryTree(value)
return self._right
def show(self):
print(self._data)
def preOrder(self): #
print(self._data) #
if self._left: #
self._left.preOrder()
if self._right: #
self._right.preOrder()
def postOrder(self): #
if self._left: #
self._left.postOrder()
if self._right: #
self._right.postOrder()
print(self._data)
def inOrder(self): #
if self._left: #
self._left.inOrder()
print(self._data)
if self._right: #
self._right.inOrder()
if __name__=='__main__':
print('Please use me as a model !')
6.有向図、有向図Dは、秩序化された三元群(V(D)、A(D)を指す.ψD),そのうちψD)は、A(D)の各要素(エッジまたはアークと呼ばれる)をV(D)の秩序化要素(頂点または点と呼ばれる)のペアに対応させる関連関数です.図面構造をカスタマイズします.
def searchPath(graph,start,end):
results=[]
__generatePath(graph,[start],end,results)
reults.sort(key=lambda x:len(x)) #
return results
def __generatePath(graph,path,end,results):
current=path[-1]
if current==end:
results.append(path)
else:
for i in graph[current]:
if i not in path:
__generatePath(graph,path+[n],end,results)
def showPath(results):
print('The path from ',results[0][0], 'to' ,results[0][-1],' is: ')
for path in results:
print(path)
if __name__=='__main__':
graph={'A':['B','C','D']
'B':['C']
'C':['D']
'D':['E']}
r1=searchPath(graph,'A','D')
showPath(r1)
>>>The path is from A to D is:
>>>['A','D']
>>>['A','B','C','D']
その他参考記事:Python開発環境構築:https://blog.csdn.net/qxyloveyy/article/details/104227923Pythonシーケンスは記事を参照してください.https://blog.csdn.net/qxyloveyy/article/details/104391462
あなたに役に立つことを望みます!