資料結構中一些常用的演算法

2021-08-21 15:24:49 字數 2803 閱讀 9899

1.計算二項式係數(動態規劃)

# coding:utf-8

# computing c(n,k)

def binomial_coefficient(n,k):

if k == 0 or k == n:

result = 1

else:

result = binomial_coefficient(n-1,k-1)+binomial_coefficient(n-1,k)

return result

print binomial_coefficient(10,3)

2.floyd演算法

# coding:utf-8

# floyd

_ = float('inf')

a = [[0,_,3,_],[2,0,_,_],[_,7,0,1],[6,_,_,0]]

for k in range(4):

for i in range(4):

for j in range(4):

if a[i][j] > a[i][k] + a[k][j]:

a[i][j] = a[i][k] + a[k][j]

else:

pass

print a

3.揹包問題

# coding:utf-8

# knapsack_problem

w = [2,1,3,2]

v = [12,10,20,15]

matrix =

sub_lst =

for i_i in range(5):

for j_j in range(6):

sub_lst =

for i in range(1,5):

for j in range(1,6):

if j >= w[i-1]:

matrix[i][j] = max(matrix[i-1][j],v[i-1]+matrix[i-1][j-w[i-1]])

else:

matrix[i][j] = matrix[i-1][j]

print matrix

4.用於計算最小公約數的euclid演算法

# coding:utf-8

# euclid

def euclid(m,n):

while n != 0:

r = m % n

m = n

n = r

return m

print euclid(60,24)

5.求乙個一維陣列中大小最接近的兩個元素的差

# coding:utf-8

# mindistance

def mindistance(lst):

dmin = float('inf')

for i in range(len(lst)):

for j in range(len(lst)):

if i < j and abs(lst[i]-lst[j]) < dmin:

dmin = abs(lst[i] - lst[j])

else:

pass

return dmin

print mindistance([1,99,5,10,23,80])

6.計算乙個十進位制數轉換為二進位制數後的位數

# coding:utf-8

# calculate count of binary

# method1

def binary(n):

count = 1

while n > 1:

count += 1

n = n / 2

return count

print binary(4)

# method2

def binary2(n):

if n == 1:

return 1

else:

return binary2(n/2)+1

print binary2(4)

7. 選擇排序

# coding:utf-8

# selection_sort

def swap(a,b):

tmp = a

a = b

b = tmp

return a,b

def selection_sort(lst):

for i in range(len(lst)-1):

min = i

for j in range(1,len(lst)):

if lst[j] < lst[min]:

min = j

lst[i],lst[min] = swap(lst[i],lst[min])

return lst

print selection_sort([3,1,2])

8.氣泡排序

# coding:utf-8

# bubblesort

def swap(a,b):

tmp = a

a = b

b = tmp

return a,b

def bubble_sort(lst):

for i in range(len(lst)-1):

for j in range(len(lst)-1-i):

if lst[j+1] < lst[j]:

lst[j],lst[j+1] = swap(lst[j],lst[j+1])

return lst

print bubble_sort([3,1,2])

資料結構與演算法 一些常用的演算法技巧總結

陣列的下標是乙個隱含的很有用的陣列,特別是在統計一些數字,或者判斷一些整型數是否出現過的時候。例如,給你一串字母,讓你判斷這些字母出現的次數時,我們就可以把這些字母作為下標,在遍歷的時候,如果字母a遍歷到,則arr a 就可以加1了,即 arr a 通過這種巧用下標的方法,我們不需要逐個字母去判斷。...

一些資料結構

dir heapq about all builtins cached doc file loader name package spec heapify max heapreplace max siftdown siftdown max siftup siftup max heapify heap...

一些常用的資料結構維護手法

這篇會理論上講一講常用的資料結構維護手法。我是嘴巴選手我自豪!cdq分治 現在我們有一些修改,有一些詢問,修改之間獨立。我們考慮分治,對於左右兩半分別分治,然後對於左邊的修改計算對右邊詢問的貢獻。本身的複雜度是o nlogn 整體二分 現在我們有一些修改,有一些詢問。我們需要求出,在最少多少組修改之...