導航:首頁 > 編程語言 > 哈夫曼的實現Python

哈夫曼的實現Python

發布時間:2022-04-03 20:24:19

⑴ 怎樣用python實現這樣一個簡單程序

defnumberInputer(prompt,quitflat):
"""prompt:輸入時的提示信息,
quitflag:退出標識字
"""
whileTrue:
gotter=rawinput(prompt+',"%s"forquit'%quitflag)
ifgotter==quitflag:
break
try:
yieldint(gotter)
except:
continue

degrees=[]
fordegreeinnumberInputer(prompt="請輸入考試分數",quitflag="Q"):
degrees.append(degreee)
print"分數中大於60的分數之和",sum(filter(lambdax:x>=60,degrees))

⑵ 用Python如何實現呢

start_i = 5
result = 1
while(start_i<=500):
if start_i != 99:
result = result * start_i
start_i = start_i + 1
print(result)

⑶ python 哈夫曼編碼 有沒有庫實現

認識哈夫曼樹之前首先我們簡單的來了解一下二叉樹,不難理解,二叉樹就是每個節點都只有2個子節點的樹狀結構,也就分為父節點(parent node)、左子樹(left child)和右子樹(right child)。
每個節點最多隻能有2個節點,當然也可以更少,比如只有左節點沒有右節點或者相反,沒有子節點的節點我們稱之為葉節點,有子樹的稱之為根節點。

⑷ 使用python語言實現

如果說是輸入-1時結束,並且-1也算在內的話,那麼:
a = []
b = 1
while True:
c = int(input('請輸入第'+str(b)+'個數:'))#輸入的數必須是可以轉換成整數的字元串
a.append(c)
if c == -1:
break
b += 1
print('一共輸入了'+str(len(a))+'個數')#len是求出一個序列的總元素個數的內置函數
#相關的資料可以在網路上查
print('最大值是'+str(max(a)))
print('最小值是'+str(min(a)))
print('和是'+str(sum(a)))
print('平均數是'+str(sum(a) / len(a)))

⑸ 如何實現Python自增運算

在語法上出現自增自減運算符可能是不夠優雅的。作為一門注重效率的語言,C語言中出現自增自減操作可能是為了生成高效的機器碼,因為這些操作可以直接映射成CPU的指令 而Python、Ruty等現代語言的設計哲學是「優雅」、「明確」、「簡單」。其設計目標之一是讓代碼具備高度的可閱讀性。像javaScript等語言也不推薦使用++、--運算符。

⑹ 用python寫一個程序實現求x的y次方,採用while或者for 來寫,急啊,求求你們了!

其實有很多方法可以求次方的:

defpower(x,y):
v=x
foriinrange(2,y+1):
x*=v
returnx

x=2
y=10

printpower(x,y)

printx**y

printpow(x,y)

編程實現建立一棵哈夫曼樹,採用鏈表存儲方式,並進行哈夫曼編碼。

#include<iostream.h>#include<stdio.h>#include<stdlib.h> struct node{ int data; int k; node *rchild,*lchild; }; node* create(node a[],int n){ int min,min2; node *p=(node *)malloc(sizeof(node)); for(int i=0;i<2*n;i++) { a[i].k=0; a[i].lchild=a[i].rchild=NULL; } for(i=0;i<n;i++) cin>>a[i].data; int j=n; while(j!=(2*n-1)) { min=299; min2=299; for(i=0;i<j;i++) { if(a[i].k!=1) { if(a[i].data<min) { min=a[i].data; a[i].k=1; a[j].lchild=&a[i]; } } } for(i=0;i<j;i++) { if(a[i].k!=1) { if(a[i].data<min2) { min2=a[i].data; a[i].k=1; a[j].rchild=&a[i]; } } } a[j].data=min+min2; j++; } p=&a[2*n-2]; return p;} void bianliye(node *b){ if(b!=NULL) { bianliye(b->lchild); if((b->lchild==NULL)&&(b->rchild==NULL)) cout<<b->data<<" "; bianliye(b->rchild); }} void main(){ node a[10]={0}; node *root=NULL; cout<<"請輸入節點的權值:"; root=create(a,5); cout<<"葉子節點為:"; bianliye(root);}

⑻ 請描述哈夫曼演算法,並用圖描述構造哈夫曼樹的過程。

這個講的相當清楚。
首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N個權值Wi(i=1,2,...n)構成一棵有N個葉結點的二叉樹,相應的葉結點的路徑長度為Li(i=1,2,...n)。可以證明哈夫曼樹的WPL是最小的。
哈夫曼在上世紀五十年代初就提出這種編碼時,根據字元出現的概率來構造平均長度最短的編碼。它是一種變長的編碼。在編碼中,若各碼字長度嚴格按照碼字所對應符號出現概率的大小的逆序排列,則編碼的平均長度是最小的。(註:碼字即為符號經哈夫曼編碼後得到的編碼,其長度是因符號出現的概率而不同,所以說哈夫曼編碼是變長的編碼。)
然而怎樣構造一棵哈夫曼樹呢?最具有一般規律的構造方法就是哈夫曼演算法。一般的數據結構的書中都可以找到其描述:
一、對給定的n個權值{W1,W2,W3,...,Wi,...,Wn}構成n棵二叉樹的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉樹Ti中只有一個權值為Wi的根結點,它的左右子樹均為空。(為方便在計算機上實現演算法,一般還要求以Ti的權值Wi的升序排列。)
二、在F中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。
三、從F中刪除這兩棵樹,並把這棵新的二叉樹同樣以升序排列加入到集合F中。
四、重復二和三兩步,直到集合F中只有一棵二叉樹為止。
用C語言實現上述演算法,可用靜態的二叉樹或動態的二叉樹。若用動態的二叉樹可用以下數據結構: struct tree{
float weight; /*權值*/
union{
char leaf; /*葉結點信息字元*/
struct tree *left; /*樹的左結點*/
};
struct tree *right; /*樹的右結點*/
};
struct forest{ /*F集合,以鏈表形式表示*/
struct tree *ti; /* F中的樹*/
struct forest *next; /* 下一個結點*/
};
例:若字母A,B,Z,C出現的概率為:0.75,0.54,0.28,0.43;則相應的權值為:75,54,28,43。
構造好哈夫曼樹後,就可根據哈夫曼樹進行編碼。例如:上面的字元根據其出現的概率作為權值構造一棵哈夫曼樹後,經哈夫曼編碼得到的對應的碼值。只要使用同一棵哈夫曼樹,就可把編碼還原成原來那組字元。顯然哈夫曼編碼是前綴編碼,即任一個字元的編碼都不是另一個字元的編碼的前綴,否則,編碼就不能進行翻譯。例如:a,b,c,d的編碼為:0,10,101,11,對於編碼串:1010就可翻譯為bb或ca,因為b的編碼是c的編碼的前綴。剛才進行哈夫曼編碼的規則是從根結點到葉結點(包含原信息)的路徑,向左孩子前進編碼為0,向右孩子前進編碼為1,當然你也可以反過來規定。
這種編碼方法是靜態的哈夫曼編碼,它對需要編碼的數據進行兩遍掃描:第一遍統計原數據中各字元出現的頻率,利用得到的頻率值創建哈夫曼樹,並必須把樹的信息保存起來,即把字元0-255(2^8=256)的頻率值以2-4BYTES的長度順序存儲起來,(用4Bytes的長度存儲頻率值,頻率值的表示範圍為0--2^32-1,這已足夠表示大文件中字元出現的頻率了)以便解壓時創建同樣的哈夫曼樹進行解壓;第二遍則根據第一遍掃描得到的哈夫曼樹進行編碼,並把編碼後得到的碼字存儲起來。 靜態哈夫曼編碼方法有一些缺點:一、對於過短的文件進行編碼的意義不大,因為光以4BYTES的長度存儲哈夫曼樹的信息就需1024Bytes的存儲空間;二、進行哈夫曼編碼,存儲編碼信息時,若用與通訊網路,就會引起較大的延時;三、對較大的文件進行編碼時,頻繁的磁碟讀寫訪問會降低數據編碼的速度。
因此,後來有人提出了一種動態的哈夫曼編碼方法。動態哈夫曼編碼使用一棵動態變化的哈夫曼樹,對第t+1個字元的編碼是根據原始數據中前t個字元得到的哈夫曼樹來進行的,編碼和解碼使用相同的初始哈夫曼樹,每處理完一個字元,編碼和解碼使用相同的方法修改哈夫曼樹,所以沒有必要為解碼而保存哈夫曼樹的信息。編碼和解碼一個字元所需的時間與該字元的編碼長度成正比,所以動態哈夫曼編碼可實時進行。動態哈夫曼編碼比靜態哈夫曼編碼復雜的多,有興趣的讀者可參考有關數據結構與演算法的書籍。
前面提到的JPEG中用到了哈夫曼編碼,並不是說JPEG就只用哈夫曼編碼就可以了,而是一幅圖片經過多個步驟後得到它的一列數值,對這些數值進行哈夫曼編碼,以便存儲或傳輸。哈夫曼編碼方法比較易懂,大家可以根據它的編碼方法,自己編寫哈夫曼編碼和解碼的程序。

⑼ Python的幾種實現

Python自身作為一門編程語言,它有多種實現。這里的實現指的是符合Python語言規范的Python解釋程序以及標准庫等。這些實現雖然實現的是同一種語言,但是彼此之間,特別是與CPython之間還是有些差別的。
下面分別列出幾個主要的實現。
1.CPython:這是Python的官方版本,使用C語言實現,使用最為廣泛,新的語言特性一般也最先出現在這里。
CPython實現會將源文件(py文件)轉換成位元組碼文件(pyc文件),然後運行在Python虛擬機上。
2.J
ython:這是Python的Java實現,相比於CPython,它與Java語言之間的互操作性要遠遠高於CPython和C語言之間的互操作性。
在Python中可以直接使用Java代碼庫,這使得使用Python可以方便地為Java程序寫測試代碼,更進一步,可以在Python中使用Swing等圖形庫編寫GUI程序。
Jython會將Python代碼動態編譯成Java位元組碼,然後在JVM上運行轉換後的程序,這意味著此時Python程序與Java程序沒有區別,只是源代碼不一樣。
在Python 中寫一個類,像使用Java 類一樣使用這個類是很容易的事情。
你甚至可以把Jython 腳本靜態地編譯為Java 位元組碼。
示例代碼:fromjava.langimportSystemSystem.out.write('Hello World!
')
3.Python for .NET:它實質上是CPython實現的
.NET託管版本,它與.NET庫和程序代碼有很好的互操作性。4.
IronPython:不同於Python for .NET,它是Python的C#實現,並且它將Python代碼編譯成C#中間代碼(與Jython類似),然後運行,它與.NET語言的互操作性也非常好。5.
PyPy:Python的Python實現版本,原理是這樣的,PyPy運行在CPython(或者其它實現)之上,用戶程序運行在PyPy之上。它的一個目標是成為Python語言自身的試驗場,因為可以很容易地修改PyPy解釋器的實現(因為它是使用Python寫的)。6.
Stackless:CPython的一個局限就是每個Python函數調用都會產生一個C函數調用。這意味著同時產生的函數調用是有限制的,因此Python難以實現用戶級的線程庫和復雜遞歸應用。一旦超越這個限制,程序就會崩潰。Stackless的Python實現突破了這個限制,一個C棧幀可以擁有任意數量的Python棧幀。這樣你就能夠擁有幾乎無窮的函數調用,並能支持巨大數量的線程。Stackless唯一的問題就是它要對現有的CPython解釋器做重大修改。所以它幾乎是一個獨立的分支。另一個名為Greenlets的項目也支持微線程。它是一個標準的C擴展,因此不需要對標准Python解釋器做任何修改。
下面的這篇文章對Stackless做了比較多的介紹,但是也比較難以讀懂:
可愛的 Python:Python實現內幕

閱讀全文

與哈夫曼的實現Python相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:61
Windows常用c編譯器 瀏覽:778
關於改善國家網路安全的行政命令 瀏覽:833
安卓如何下載網易荒野pc服 瀏覽:654
javainetaddress 瀏覽:104
蘋果4s固件下載完了怎麼解壓 瀏覽:1002
命令zpa 瀏覽:285
python編譯器小程序 瀏覽:944
在app上看視頻怎麼光線調暗 瀏覽:540
可以中文解壓的解壓軟體 瀏覽:592
安卓卸載組件應用怎麼安裝 瀏覽:912
使用面向對象編程的方式 瀏覽:339
程序員項目經理的年終總結範文 瀏覽:929
內衣的加密設計用來幹嘛的 瀏覽:432
淮安數據加密 瀏覽:292
魔高一丈指標源碼 瀏覽:982
松下php研究所 瀏覽:168
c回調java 瀏覽:399
夢幻端游長安地圖互通源碼 瀏覽:745
電腦本地文件如何上傳伺服器 瀏覽:313