![處女座-算法視頻二_第1頁(yè)](http://file4.renrendoc.com/view/952c650b51496557595056539f695308/952c650b51496557595056539f6953081.gif)
![處女座-算法視頻二_第2頁(yè)](http://file4.renrendoc.com/view/952c650b51496557595056539f695308/952c650b51496557595056539f6953082.gif)
![處女座-算法視頻二_第3頁(yè)](http://file4.renrendoc.com/view/952c650b51496557595056539f695308/952c650b51496557595056539f6953083.gif)
![處女座-算法視頻二_第4頁(yè)](http://file4.renrendoc.com/view/952c650b51496557595056539f695308/952c650b51496557595056539f6953084.gif)
![處女座-算法視頻二_第5頁(yè)](http://file4.renrendoc.com/view/952c650b51496557595056539f695308/952c650b51496557595056539f6953085.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
算法基礎(chǔ)第一部分算法簡(jiǎn)單概念算法概念復(fù)習(xí):遞歸時(shí)間復(fù)雜度空間復(fù)雜度2023年1月30日算法基礎(chǔ)2什么是算法?算法(Algorithm):一個(gè)計(jì)算過(guò)程,解決問(wèn)題的方法2023年1月30日算法基礎(chǔ)3算法輸入輸出復(fù)習(xí):遞歸遞歸的兩個(gè)特點(diǎn):調(diào)用自身結(jié)束條件看下面幾個(gè)函數(shù):2023年1月30日算法基礎(chǔ)4deffunc1(x):
print(x)
func1(x-1)
deffunc2(x):
ifx>0:
print(x)
func2(x+1)deffunc3(x):
ifx>0:
print(x)
func3(x-1)
deffunc4(x):
ifx>0:
func4(x-1)
print(x)時(shí)間復(fù)雜度看代碼:2023年1月30日算法基礎(chǔ)5print('HelloWorld')foriinrange(n):
print('HelloWorld')foriinrange(n):
forjinrange(n):
print('HelloWorld')foriinrange(n):
forjinrange(n):
forkinrange(n):
print('HelloWorld')左面四組代碼,哪組運(yùn)行時(shí)間最短?用什么方式來(lái)體現(xiàn)代碼(算法)運(yùn)行的快慢?時(shí)間復(fù)雜度類比生活中的一些事件,估計(jì)時(shí)間:眨一下眼口算“29+68”燒一壺水睡一覺(jué)完成一個(gè)項(xiàng)目飛船從地球飛出太陽(yáng)系2023年1月30日算法基礎(chǔ)6一瞬間/幾毫秒幾秒幾分鐘幾小時(shí)幾天/幾星期/幾個(gè)月幾年時(shí)間復(fù)雜度時(shí)間復(fù)雜度:用來(lái)評(píng)估算法運(yùn)行效率的一個(gè)東西2023年1月30日算法基礎(chǔ)7print('HelloWorld')foriinrange(n):
print('HelloWorld')foriinrange(n):
forjinrange(n):
print('HelloWorld')foriinrange(n):
forjinrange(n):
forkinrange(n):
print('HelloWorld')O(n2)O(n)O(1)O(n3)時(shí)間復(fù)雜度那這些代碼呢?2023年1月30日算法基礎(chǔ)8print('HelloWorld')print('HelloPython')print(‘Hello
Algorithm’)foriinrange(n):print('HelloWorld’)
forjinrange(n):
print('HelloWorld')foriinrange(n):
forjinrange(i):
print('HelloWorld')O(3)O(n2+n)O(1/2n2)O(1)O(n2)O(n2)時(shí)間復(fù)雜度2023年1月30日算法基礎(chǔ)9那這個(gè)代碼呢?whilen>1:
print(n)
n=n//2n=64輸出:64321684226=64log264=6O(log2n)或O(logn)時(shí)間復(fù)雜度-小結(jié)時(shí)間復(fù)雜度是用來(lái)估計(jì)算法運(yùn)行時(shí)間的一個(gè)式子(單位)。一般來(lái)說(shuō),時(shí)間復(fù)雜度高的算法比復(fù)雜度低的算法快。常見(jiàn)的時(shí)間復(fù)雜度(按效率排序)O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)不常見(jiàn)的時(shí)間復(fù)雜度(看看就好)O(n!)
O(2n)
O(nn)
…如何一眼判斷時(shí)間復(fù)雜度?循環(huán)減半的過(guò)程O(píng)(logn)幾次循環(huán)就是n的幾次方的復(fù)雜度2023年1月30日算法基礎(chǔ)10空間復(fù)雜度空間復(fù)雜度:用來(lái)評(píng)估算法內(nèi)存占用大小的一個(gè)式子“空間換時(shí)間”2023年1月30日算法基礎(chǔ)11列表查找列表查找:從列表中查找指定元素輸入:列表、待查找元素輸出:元素下標(biāo)或未查找到元素順序查找從列表第一個(gè)元素開(kāi)始,順序進(jìn)行搜索,直到找到為止。二分查找從有序列表的候選區(qū)data[0:n]開(kāi)始,通過(guò)對(duì)待查找的值與候選區(qū)中間值的比較,可以使候選區(qū)減少一半。2023年1月30日算法基礎(chǔ)12二分查找2023年1月30日算法基owhighmidmidmid使用二分查找來(lái)查找3列表查找-代碼2023年1月30日算法基礎(chǔ)14deflinear_search(data_set,value):
foriinrange(range(data_set)):
ifdata_set[i]==value:
returni
returndefbin_search(data_set,value):
low=0
high=len(data_set)-1
whilelow<=high:
mid=(low+high)//2
ifdata_set[mid]==value:
returnmid
elifdata_set[mid]>value:
high=mid-1
else:
low=mid+1時(shí)間復(fù)雜度O(n)O(logn)列表查找:練習(xí)現(xiàn)有一個(gè)學(xué)員信息列表(按id增序排列),格式為:修改二分查找代碼,輸入學(xué)生id,輸出該學(xué)生在列表中的下標(biāo),并輸出完整學(xué)生信息。2023年1月30日算法基礎(chǔ)15[{id:1001,name:"張三",age:20},{id:1002,name:"李四",age:25},{id:1004,name:"王五",age:23},{id:1007,name:"趙六",age:33}]列表排序列表排序?qū)o(wú)序列表變?yōu)橛行蛄斜響?yīng)用場(chǎng)景:各種榜單各種表格給二分排序用給其他算法用輸入:無(wú)序列表輸出:有序列表2023年1月30日算法基礎(chǔ)16排序low
B三人組:冒泡排序選擇排序插入排序快速排序排序NB二人組:堆排序歸并排序沒(méi)什么人用的排序:基數(shù)排序希爾排序桶排序排序Low
B三人組大家自己能想到怎么完成一次排序嗎?冒泡排序選擇排序插入排序算法關(guān)鍵點(diǎn):有序區(qū)無(wú)序區(qū)2023年1月30日算法基礎(chǔ)17冒泡排序思路首先,列表每?jī)蓚€(gè)相鄰的數(shù),如果前邊的比后邊的大,那么交換這兩個(gè)數(shù)……會(huì)發(fā)生什么?2023年1月30日算法基礎(chǔ)18754638291012345678冒泡排序代碼2023年1月30日算法基礎(chǔ)19defbubble_sort(li):
foriinrange(len(li)-1):
forjinrange(len(li)-i-1):
ifli[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]時(shí)間復(fù)雜度:O(n2)冒泡排序-優(yōu)化2023年1月30日算法基礎(chǔ)20defbubble_sort_1(li):
foriinrange(len(li)-1):
exchange=False
forjinrange(len(li)-i-1):
ifli[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange=True
ifnotexchange:
return如果冒泡排序中執(zhí)行一趟而沒(méi)有交換,則列表已經(jīng)是有序狀態(tài),可以直接結(jié)束算法。選擇排序思路一趟遍歷記錄最小的數(shù),放到第一個(gè)位置;再一趟遍歷記錄剩余列表中最小的數(shù),繼續(xù)放置;……問(wèn)題是:怎么選出最小的數(shù)?2023年1月30日算法基礎(chǔ)21選擇排序代碼時(shí)間復(fù)雜度:O(n2)2023年1月30日算法基礎(chǔ)22defselect_sort(li):
foriinrange(len(li)-1):
min_loc=i
forjinrange(i+1,len(li)):
ifli[j]<li[min_loc]:
min_loc=j
ifmin_loc!=i:
li[i],li[min_loc]=li[min_loc],li[i]插入排序思路列表被分為有序區(qū)和無(wú)序區(qū)兩個(gè)部分。最初有序區(qū)只有一個(gè)元素。每次從無(wú)序區(qū)選擇一個(gè)元素,插入到有序區(qū)的位置,直到無(wú)序區(qū)變空。2023年1月30日算法基礎(chǔ)23574631298插入排序代碼時(shí)間復(fù)雜度:O(n2)優(yōu)化空間:應(yīng)用二分查找來(lái)尋找插入點(diǎn)(并沒(méi)有什么卵用)2023年1月30日算法基礎(chǔ)24definsert_sort(li):
foriinrange(1,len(li)):
tmp=li[i]
j=i-1
whilej>=0andtmp<li[j]:
li[j+1]=li[j]
j=j-1
li[j+1]=tmp小結(jié)——排序LOW
B三人組冒泡排序插入排序選擇排序時(shí)間復(fù)雜度:O(n2)空間復(fù)雜度:O(1)練習(xí):嘗試自己寫(xiě)一遍這三種排序方式的代碼對(duì)于前面給出的學(xué)生信息列表,使用冒泡排序?qū)ζ溥M(jìn)行升序排序2023年1月30日算法基礎(chǔ)25快速排序快速排序:快好寫(xiě)的排序算法里最快的快的排序算法里最好寫(xiě)的2023年1月30日算法基礎(chǔ)26快速排序思路快排思路:取一個(gè)元素p(第一個(gè)元素),使元素p歸位;列表被p分成兩部分,左邊都比p小,右邊都比p大;遞歸完成排序。2023年1月30日算法基礎(chǔ)27574631298123456789214356798排序前:目標(biāo):P歸位:算法關(guān)鍵點(diǎn):整理遞歸快速排序代碼——第一步defquick_sort(data,left,right):
ifleft<right:
mid=partition(data,left,right)
quick_sort(data,left,mid-1)
quick_sort(data,mid+1,right)2023年1月30日算法基礎(chǔ)28怎么寫(xiě)partition函數(shù)2023年1月30日算法基礎(chǔ)29574631298574631298214356798快速排序代碼——第二步defpartition(data,left,right):
tmp=data[left]
whileleft<right:
whileleft<rightanddata[right]>=tmp:
right-=1
data[left]=data[right]
whileleft<rightanddata[left]<=tmp:
left+=1
data[right]=data[left]
data[left]=tmp
returnleft2023年1月30日算法基礎(chǔ)30還不理解partition函數(shù)?defpartition(data,left,right):
tmp=data[left]
whileleft<right:
whileleft<rightanddata[right]>=tmp:
right-=1
data[left]=data[right]
whileleft<rightanddata[left]<=tmp:
left+=1
data[right]=data[left]
data[left]=tmp
returnleft2023年1月30日算法基礎(chǔ)31574631298跟著我右手左手一個(gè)慢動(dòng)作右手左手慢動(dòng)作重播快速排序-如何效率快速排序真的比冒泡排序快嗎?為什么快了?快了多少?問(wèn)題最壞情況遞歸2023年1月30日算法基礎(chǔ)32快速排序-練習(xí)如果想將列表進(jìn)行降序排序,應(yīng)該修改哪些符號(hào)?還是對(duì)于剛才那個(gè)學(xué)生信息表,修改快速排序代碼,使其能夠進(jìn)行排序。2023年1月30日算法基礎(chǔ)33堆排序前傳——樹(shù)與二叉樹(shù)簡(jiǎn)介樹(shù)是一種數(shù)據(jù)結(jié)構(gòu)比如:目錄結(jié)構(gòu)樹(shù)是一種可以遞歸定義的數(shù)據(jù)結(jié)構(gòu)樹(shù)是由n個(gè)節(jié)點(diǎn)組成的集合:如果n=0,那這是一棵空樹(shù);如果n>0,那存在1個(gè)節(jié)點(diǎn)作為樹(shù)的根節(jié)點(diǎn),其他節(jié)點(diǎn)可以分為m個(gè)集合,每個(gè)集合本身又是一棵樹(shù)。一些概念根節(jié)點(diǎn)、葉子節(jié)點(diǎn)樹(shù)的深度(高度)樹(shù)的度孩子節(jié)點(diǎn)/父節(jié)點(diǎn)子樹(shù)2023年1月30日算法基礎(chǔ)34特殊且常用的樹(shù)——二叉樹(shù)二叉樹(shù):度不超過(guò)2的樹(shù)(節(jié)點(diǎn)最多有兩個(gè)叉)2023年1月30日算法基礎(chǔ)35兩種特殊二叉樹(shù)滿二叉樹(shù)完全二叉樹(shù)2023年1月30日算法基礎(chǔ)36二叉樹(shù)的存儲(chǔ)方式鏈?zhǔn)酱鎯?chǔ)方式順序存儲(chǔ)方式(列表)父節(jié)點(diǎn)和左孩子節(jié)點(diǎn)的編號(hào)下標(biāo)有什么關(guān)系?0-1
1-3
2-5
3-7
4-9父節(jié)點(diǎn)和右孩子節(jié)點(diǎn)的編號(hào)下標(biāo)有什么關(guān)系?0-2
1-4
2-6
3-8
4-10比如,我們要找根節(jié)點(diǎn)左孩子的左孩子2023年1月30日算法基礎(chǔ)37987210563498765012430123456789i
–
2i+1i
–
2i+2二叉樹(shù)小結(jié)二叉樹(shù)是度不超過(guò)2的樹(shù)滿二叉樹(shù)與完全二叉樹(shù)(完全)二叉樹(shù)可以用列表來(lái)存儲(chǔ),通過(guò)規(guī)律可以從父親找到孩子或從孩子找到父親2023年1月30日算法基礎(chǔ)38堆排序堆大根堆:一棵完全二叉樹(shù),滿足任一節(jié)點(diǎn)都比其孩子節(jié)點(diǎn)大小根堆:一棵完全二叉樹(shù),滿足任一節(jié)點(diǎn)都比其孩子節(jié)點(diǎn)小2023年1月30日算法基礎(chǔ)39堆排序2023年1月30日算法基礎(chǔ)409872105634大根堆:1264975386小根堆:堆這個(gè)玩意…2023年1月30日算法基礎(chǔ)412976105384假設(shè):節(jié)點(diǎn)的左右子樹(shù)都是堆,但自身不是堆當(dāng)根節(jié)點(diǎn)的左右子樹(shù)都是堆時(shí),可以通過(guò)一次向下的調(diào)整來(lái)將其變換成一個(gè)堆。堆排序過(guò)程建立堆得到堆頂元素,為最大元素去掉堆頂,將堆最后一個(gè)元素放到堆頂,此時(shí)可通過(guò)一次調(diào)整重新使堆有序。堆頂元素為第二大元素。重復(fù)步驟3,直到堆變空。2023年1月30日算法基礎(chǔ)42構(gòu)造堆2023年1月30日算法基礎(chǔ)436812703954挨個(gè)出數(shù)2023年1月30日算法基礎(chǔ)449872105634堆排序代碼2023年1月30日算法基礎(chǔ)45defsift(data,low,high):
i=low
j=2*i+1
tmp=data[i]
whilej<=high:
ifj<highanddata[j]<data[j+1]:
j+=1
iftmp<data[j]:
data[i]=data[j]
i=j
j=2*i+1
else:
break
data[i]=tmpdefheap_sort(data):
n=len(data)
foriinrange(n//2-1,-1,-1):
sift(data,i,n-1)
foriinrange(n-1,-1,-1):
data[0],data[i]=data[i],data[0]
sift(data,0,i-1)歸并排序假設(shè)現(xiàn)在的列表分兩段有序,如何將其合成為一個(gè)有序列表這種操作稱為一次歸并。2023年1月30日算法基礎(chǔ)46253178694一次歸并代碼defmerge(li,low,mid,high):
i=low
j=mid+1
ltmp=[]
whilei<=midandj<=high:
ifli[i]<=li[j]:
ltmp.append(li[i])
i+=1
else:
ltmp.append(li[j])
j+=1
whilei<=mid:
ltmp.append(li[i])
i+=1
whilej<=high:
ltmp.append(li[j])
j+=1
li[low:high+1]=ltmp2023年1月30日算法基礎(chǔ)47有了歸并怎么用?分解:將列表越分越小,直至分成一個(gè)元素。一個(gè)元素是有序的。合并:將兩個(gè)有序列表歸并,列表越來(lái)越大。2023年1月30日算法基礎(chǔ)48歸并排序defmergesort(li,low,high):
iflow<high:
mid=(low+high)//2
mergesort(li,low,mid)
mergesort(li,mid+1,high)
merge(li,low,mid,high)2023年1月30日算法基礎(chǔ)49時(shí)間復(fù)雜度:O(nlogn)空間復(fù)雜度:O(n)快速排序、堆排序、歸并排序-小結(jié)三種排序算法的時(shí)間復(fù)雜度都是O(nlogn)一般情況下,就運(yùn)行時(shí)間而言:快速排序<歸并排序<堆排序三種排序算法的缺點(diǎn):快速排序:極端情況下排序效率低歸并排序:需要額外的內(nèi)存開(kāi)銷堆排序:在快的排序算法中相對(duì)較慢2023年1月30日算法基礎(chǔ)50希爾排序思路希爾排序是一種分組插入排序算法。首先取一個(gè)整數(shù)d1=n/2,將元素分為d1個(gè)組,每組相鄰量元素之間距離為d1,在各組內(nèi)進(jìn)行直接插入排序;取第二個(gè)整數(shù)d2=d1/2,重復(fù)上述分組排序過(guò)程,直到di=1,即所有元素在同一組內(nèi)進(jìn)行直接插入排序。希爾排序每趟并不使某些元素有序,而是使整體數(shù)據(jù)越來(lái)越接近有序;最后一趟排序使得所有數(shù)據(jù)有序。2023年1月30日算法基礎(chǔ)51574631298d=4d=2d=1希爾排序defshell_sort(li):
gap=len(li)//2
whilegap>0:
foriinrange(gap,len(li)):
tmp=li[i]
j=i-gap
whilej>=0andtmp<li[j]:
li[j+gap]=li[j]
j-=gap
li[j+gap]=tmp
gap/=22023年1月30日算法基礎(chǔ)52時(shí)間復(fù)雜度: O((1+τ)n)
O(1.3n)排序-小結(jié)排序方法時(shí)間復(fù)雜度穩(wěn)定性代碼復(fù)雜度最壞情況平均情況最好情況冒泡排序O(n2)O(n2)O(n)穩(wěn)定簡(jiǎn)單直接選擇排序O(n2)O(n2)O(n2)不穩(wěn)定簡(jiǎn)單直接插入排序O(n2)O(n2)O(n2)穩(wěn)定簡(jiǎn)單快速排序O(n2)O(nlogn)O(nlogn)不穩(wěn)定較復(fù)雜堆排序O(nlogn)O(nlogn)O(nlogn)不穩(wěn)定復(fù)雜歸并排序O(nlogn)O(nlogn)O(nlogn)穩(wěn)定較復(fù)雜希爾排序O(1.3n)不穩(wěn)定較復(fù)雜2023年1月30日算法基礎(chǔ)53排序-贈(zèng)品1現(xiàn)在有一個(gè)列表,列表中的數(shù)范圍都在0到100之間,列表長(zhǎng)度大約為100萬(wàn)。設(shè)計(jì)算法在O(n)時(shí)間復(fù)雜度內(nèi)將列表進(jìn)行排序。2023年1月30日算法基礎(chǔ)54贈(zèng)品1-計(jì)數(shù)排序創(chuàng)建一個(gè)列表,用來(lái)統(tǒng)計(jì)每個(gè)數(shù)出現(xiàn)的次數(shù)。2023年1月30日算法基礎(chǔ)55defcount_sort(li,max_num):
count=[0foriinrange(max_num+1)]
fornuminli:
count[num]+=1
i=0
fornum,minenumerate(count):
forjinrange(m):
li[i]=num
i+=1排序-贈(zèng)品2現(xiàn)在有n個(gè)數(shù)(n>10000),設(shè)計(jì)算法,按大小順序得到前10大的數(shù)。應(yīng)用場(chǎng)景:榜單TOP
102023年1月30日算法基礎(chǔ)56贈(zèng)品2-堆的應(yīng)用(了解)解決思路:取列表前10個(gè)元素建立一個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司餐廳裝修合同范本
- 副總勞務(wù)合同范本
- 產(chǎn)品轉(zhuǎn)讓合同范本
- 商業(yè)使用門面房出租合同范本
- 修腳店入股合同范例
- 二手升降機(jī)銷售合同范例
- 工程服務(wù)類合同范本
- 教學(xué)儀器購(gòu)銷合同范本
- 出境社旅游合同范本
- 農(nóng)業(yè)種植項(xiàng)目合同范例
- 2024年燃?xì)廨啓C(jī)值班員技能鑒定理論知識(shí)考試題庫(kù)-下(多選、判斷題)
- 交通法規(guī)課件
- (優(yōu)化版)高中地理新課程標(biāo)準(zhǔn)【2024年修訂版】
- 《Python程序設(shè)計(jì)》課件-1:Python簡(jiǎn)介與應(yīng)用領(lǐng)域
- 各類心理量表大全
- DB12T990-2020建筑類建設(shè)工程規(guī)劃許可證設(shè)計(jì)方案規(guī)范
- DB11T 1481-2024生產(chǎn)經(jīng)營(yíng)單位生產(chǎn)安全事故應(yīng)急預(yù)案評(píng)審規(guī)范
- 《氓》教學(xué)設(shè)計(jì) 2023-2024學(xué)年統(tǒng)編版高中語(yǔ)文選擇性必修下冊(cè)
- 《網(wǎng)店運(yùn)營(yíng)與管理》第3版 課件全套 白東蕊 第1-11章 網(wǎng)上開(kāi)店概述- 移動(dòng)網(wǎng)店運(yùn)營(yíng)
- 2024年全國(guó)國(guó)家電網(wǎng)招聘之電網(wǎng)計(jì)算機(jī)考試歷年考試題(附答案)
- 化學(xué)元素周期表注音版
評(píng)論
0/150
提交評(píng)論