適配演算法
㈠ 最佳適應演算法的空白區一般是按照 ( )排列。
按大小遞增順序排列。
最佳適應演算法是從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區的一種計算方法,這種方法能使碎片盡量小。
最佳適應演算法(Best Fit):
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小。為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留大的空閑區,但造成許多小的空閑區。
㈡ 兩個人之間的匹配度,兩個人容貌上匹配程度
提起兩個人之間的匹配度,大家都知道,有人問兩個人容貌上匹配程度,另外,還有人想問匹配的圖的定義,你知道這是怎麼回事?其實如何測試兩個人的匹配度,下面就一起來看看兩個人容貌上匹配程度,希望能夠幫助到大家!
兩個人之間的匹配度
1、兩個人之間的匹配度:兩個人容貌上匹配程度
男才女貌,應該不是指外國妞般配的兩個人有什麼特徵。
2、兩個人之間的匹配度:匹配的圖的定義
設有M個工人x1,x2,…,xm,和N項工作y1,y2,…,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。為什麼感覺有些人很般配。
人員分配問題可以用圖的語言來表述。令X={x1,x2,…,xm},Y={y1,y2,…,yn},構造二分圖G=(X,Y,E)如下:兩個人很配是什麼意思。
對於1≤i≤m,1≤j≤n,當且僅當工人xi勝任工作yi時,G中有一條邊xiyi,於是人員分配問題就成為在G中求一個匹配的問題。測試兩人婚姻匹配度。
求匹配常用匈牙利演算法,它的基本思想是:對於已知的匹配M,從X中的任一選定的M非飽和點出發,用標號法尋找M增廣鏈。如果找到M增廣鏈,則M就可以得到增廣;否則從X中另一個M非飽和點出發,繼續尋找M增廣鏈。重復這個過程直到G中不存在增廣鏈結束,此時的匹配就是G的匹配。這個算常稱為匈牙利演算法,因為這里介紹的尋找增廣鏈的標號方法是由匈牙科學者Egerváry最早提出來的。測兩個人的戀愛匹配指數。
理解了這個演算法,就不難寫出人員分配問題的解答了。在給出程序之前,先做一些假設:兩個人匹配的意思是什麼。
為了簡單起見,假設工人數等於工作數,即N=M,且N≤,這里,N也可以看作是二分圖的|X|和|Y|。測量情侶匹配度。
數據從文件input.txt中讀入,首先是N和|E|,下面|E|行每行兩個數(I,J),表示工人I可以勝任工作J,即二分圖中的邊xiyj。
結果輸出到文件output.txt,行是匹配數s,下面s行每行兩個數(I,J),表示分配工人I做工作J,即匹配邊xiyj。對於上面的人員分配問題,如果還考慮到工人做工的效率,就可以提出所謂的分派問題:應該怎樣分配才能使總的效率?看上去很般配的兩個人。
同上一節,我們可以構造一個二分圖G,如果把工人xi做工作yi的效率wij看作是G中邊xiyi的權,則分派問題就相當於在賦權二分圖G中求一個全匹配。
由線性規劃的知識,求二分圖G的權匹配,只需在匈牙利演算法的基礎上少許改進即可。它的基本思想是,對二分圖的頂點編號,然後根據編號構造一個新的二分圖G』,把求G的權匹配轉換為求G』的完美匹配。情侶照片測匹配度。
下面的這條定理是這個演算法的理論基礎。
定理:設M是賦權圖(權非負)的完全二分圖G=(V,E)的一個完美匹配,這里M是E的子集。如果M滿足:對G的任意一個完美匹配M’,均有M的邊權值之和大於M’邊的權值之和,則M是G的權匹配。兩個人很般配是什麼樣的。
下面,給出求權匹配的程序。輸入文件中首先是N和|E|,下面|E|行每行三個數(I,J,W),表示工人I做工作J的效率是W。程序輸出包括每個工人的選擇和的總效益。其它假設參見上一節的演算法假設。這個算問題:FJOI-信封問題
John先生晚上寫了n封信,並相應地寫了n個信封將信裝好,准備寄出。但是,第二天John的兒子SmallJohn將這n封信都拿出了信封。不幸的是,SmallJohn無法將拿出的信正確地裝回信封中了。對象匹配度測試。
將SmallJohn所提供的n封信依次編號為1,2,…,n;且n個信封也依次編號為1,2,…,n。假定SmallJohn能提供一組信息:第i封信肯定不是裝在信封j中。請編程幫助SmallJohn,盡可能多地將信正確地裝回信封。其中n≤。測試兩人般配程度。
例如,有4封信,而且封信不是裝在信封1、2和3中,第2封信不是裝在信封2和3中,則可以確定的封信裝在信封4中,而且第二封信則裝在信封1中。但這些條件還不足以確定第三封和第四封信的位置。看了這道題目,感覺上和小學數學競賽中的邏輯推理題如出一轍,而邏輯推理題的一般是表上作業法。
就以前面的例子為例,根據條件,可以得到如下信息:
戀愛契合度測試姓名。
1×××別人說你倆挺配的是什麼意思。
2××表格1
由於每一行每一列都應該只有一個√,因此,可以確定封信裝在信封4中,於是可以得到:
1×××√戀愛匹配度測試免費。
2×××4×如何測試情侶匹配度。
然後,發現第二行有3個×,因此剩下一個肯定是√,於是就可以得出第二封信則裝在信封1中:夫妻相匹配度測試。
測名字看兩人配不配。
1×××√
2√×××
現在,第3行和第4行都只有兩個×,因此無法確定它們放在那個信封里。
這樣我們就得到了一個初步的演算法:在程序中建立一個二維表格,首先,根據條件填入若干個×,然後,檢查所有還未確定的行和列,看有沒有一行(列)中有n–1個×,如果沒有,就結束;否則,把剩下的那一個空格填上√,並且填了√的那一行(列)的其它位置都填上×。
這種方法雖然很容易想到,但卻有針對這個方法的反例,例如:測試戀愛匹配度。
圖表3一個反例情侶匹配度測試免費。
圖中上半部分的頂點表示「信」,下半部分的頂點表示「信封」,如果信i可能放在信封j中,則在信i和信封j之間連一條邊。由於每個頂點的度數都大於或等於2,即每行每列都至少有兩個空位,故前面的演算法無法進行任何推理,而事實卻並非如此,比如說中間的那封信就只能放在中間的那個信封里。測測我和他能否在一起。
正是這個反例,使我們需要另闢蹊徑。進一步分析可以發現,信和信封之間的關系,是一種一一對應的關系,這是因為一封信只能放到一個信封里,而一個信封也只能裝一封信。而從信息學的角度來看,這種一一對應的關系,也可以看作是二分圖的匹配關系。
令X={x1,x2,…,xm},Y={y1,y2,…,yn},構造二分圖G=(X,Y,E),當且僅當信i可以放到信封j中,G中存在邊xiyj。這樣,任何一種信的分案,都可以看作是圖G的一個完美匹配。例如上圖就有且僅有如下兩種完美匹配:
圖表4所有的完美匹配
由於中間的那條匹配邊在兩個完美匹配中都出現了,因此我們認為這條匹配邊是「確定的」,換句話說,這條邊所代表的關系也是確定的。容易看出,當且僅當對於G的所有完美匹配M,都存在一條匹配邊xiyj,則可以確定信i可以放到信封j中。
這樣,我們就從匹配的角度建立了一個新的模型。那麼,這個模型要如何求解呢?戀愛適配度計算。
我們當然不能枚舉出G所有的完美匹配,然後再去求它們邊的交集——這和搜索就沒什麼分別。在這里,我們需要對這個模型再做一個小小的轉換:我們發現,條件「對於G的所有完美匹配M,都存在一條匹配邊xiyj」,等價於「如果圖G存在完美匹配,而刪除圖G中的一條邊xiyj得到的圖G』中卻不存在完美匹配」。例如,左下圖刪除了一條「關鍵邊」,故不存在完美匹配,而右下圖刪除的是一條「非關鍵邊」,故存在完美匹配。什麼叫做匹配。
圖表5刪邊的例子
從表面上看,這個演算法的時間復雜度似乎仍然很高。因為圖G中最多有n2條邊,每次試著刪除一條邊,又需要O(n3)的時間復雜度求一次完美匹配。總的復雜度高達O(n5)。查詢兩人的匹配度。
實際上,我們可以先找到圖G的一個完美匹配M,這樣,刪邊就只需考慮匹配邊了(因為刪除非匹配邊得到G』,M仍然是G』的完美匹配)。這樣,只需刪除n條邊,時間復雜度就降到了O(n4)。
再進一步分析,刪除一條邊以後,沒有必要重新找完美匹配,只需檢查可不可以找到新的增廣鏈就可以了。這樣,時間復雜度就進一步降到了O(n3)。問題:CTSC-丘比特的煩惱
隨著的不斷發展,人與人之間的感情越來越功利化。最近,愛神丘比特發現,愛情也已不再是完全純潔的了。這使得丘比特很是苦惱,他越來越難找到合適的男女,並向他們射去丘比特之箭。於是丘比特千里迢迢遠赴中國,找到了掌管東方人愛情的神——月下老人,向他求教。
月下老人告訴丘比特,純潔的愛情並不是不存在,而是他沒有找到。在東方,人們講究的是緣分。月下老人只要做一男一女兩個泥人,在他們之間連上一條紅線,那麼它們所代表的人就會相愛——無論他們身處何地。而丘比特的愛情之箭只能射中兩個距離相當近的人,選擇的范圍自然就小了很多,不能找到真正的有緣人。
丘比特聽了月下老人的解釋,茅塞頓開,回去之後用了人間的改造了自己的,使得丘比特之箭的射程大大增加。這樣,射中有緣人的機會也增加了不少。
情人節(Valentine’sday)的午夜零時,丘比特開始了自己的工作。他選擇了一組數目相等的男女,到他們互相之間的緣分大小,並依次箭,使他們產生愛意。他希望能選擇的方法,使被他選擇的每一個人被射中一次,且每一對被射中的人之間的緣分的和。
當然,無論丘比特怎麼改造自己的,總還是存在缺陷的。首先,的射程盡管增大了,但畢竟還是有限的,不能像月下老人那樣,做到「千里姻緣一線牽」。其次,無論怎麼改造,箭的軌跡終歸只能是一條直線,也就是說,如果兩個人之間的連線段上有別人,那麼莫不可向他們丘比特之箭,否則,按月下老人的話,就是「亂點鴛鴦譜」了。
作為一個凡人,你的任務是運用先進的計算機為丘比特找到的方案。
輸入文件行為正整數k,表示丘比特之箭的射程,第二行為正整數n(n<30),隨後有2n行,表示丘比特選中的人的信息,其中前n行為男子,後n行為女子。每個人的信息由兩部分組成:他的姓名和他的位置。姓名是長度小於20且僅包含字母的字串,忽略大小寫的區別,位置是由一對整數表示的坐標,它們之間用空格分隔。格式為Namexy。輸入文件剩下的部分描述了這些人的緣分。每一行的格式為。Name1和Name2為有緣人的姓名,p是他們之間的緣分值(p為小於等於的正整數)。以一個End作為文件結束標志。每兩個人之間的緣分至多隻被描述一次。如果沒有被描述,則說明他們緣分值為1。
輸出文件僅一個正整數,表示每一對被射中的人之間的緣分的總和。這個和應當是的。題目中出現了三類物體和兩種關系,我們一個個的來分析:
丘比特的箭,它有一個屬性是射程,
男人和女人,他們的屬性包括名字和位置,
男人和女人之間的關系,這個關系是他們倆的緣分值,
箭與男女的關系,如果兩人的距離不超過箭的射程,並無他人阻擋,則可能被箭射中。題目就是要求一種射箭的方案,使得所有被射中的男女的緣分和。
這個問題很像是要求一個二分圖的權匹配。因為男人和女人分屬兩個,而且同性之間沒有任何關系,因此是一個二分圖。而把緣分值記做邊上的權,則緣分和,就對應了這個二分圖中的一個權匹配。
要注意的是,題目中雖然說明沒有被描述的男女之間緣分值為1,但這並不代表所得到的二分圖是完全二分圖。因為在構圖的過程中,我們必須還考慮到箭的射程等因素——如果兩人的距離超過了箭的射程,則他倆註定無緣了。
這時問題就來了,因為題目中除了要求緣分和之外,還要求「被丘比特選擇的每一個人都要被射中一次」。
你可能會覺得,要緣分和越大,當然被射中的人越多越好,其實並不是這樣。例如:
圖表6一個反例
如果要求權匹配,則會選擇匹配邊AD,緣分和為10。但由於每個人都要被射中一次,因此我們只能選擇AC和BD,緣分和為2。
換句話說,對於這個例子,正確答案應該是2,而權匹配的值卻是10。這說明,這道題目和簡單的權匹配還是有區別的,因為題目再要求權值的同時,還要求是一個完美匹配,我們稱之為「完美」的權匹配。
那麼,這道題是否就不能用權匹配來做了呢?先別急,我們再來回顧一下求權匹配的演算法:我們通過對頂點編號,將圖G轉化為G』,然後在把求G的權匹配轉換為求G』的完美匹配——這里好像就是求完美匹配,但對於上面的那個例子,又為什麼不呢?
原來,對於上面的例子,在標號過後,新的圖G』中加入了一條新的邊BC,而這條邊的權值是0,在圖G』中的完美匹配,實際上是AD和BC,對應到圖G中,就是邊AD了。
因此,如果我們預先把BC的邊的權值設為-∞,再求圖中的權匹配,就不會再有問題了。
更一般的,如果要求二分圖的「完美」的權匹配,只需將原圖中沒有的邊的權值設為-∞,就可以了。問題:IPSC-Magic
一個的術師上台表演,跟著他的是一位漂亮的女助手。術師先從他的術帽中拽出了幾只兔子,接著他又從女助手的圍巾中變出了一束鮮花,,他把女助手鎖在一個看上去空著的箱子里。然後,術師選了一個觀眾來配合一個表演:他在一個桌子上擺出N張牌(所有N張牌兩兩不同,且N為奇數)。術師讓這位自願者走上講台從中選出(N+1)/2張牌,其餘的牌都在術師的帽子里永遠的消失了。術師在選出的牌上方晃了晃手,接著他選出其中一張交給那一位自願者,自願者向觀眾展示了手中的這張牌,隨後又將其在自己的衣袋裡。那位女助手從箱子里放出來後,來到桌前也在剩下的(N+1)/2-1張牌上方晃了晃手,馬上就說出了自願者衣袋中的是什麼牌。
這是為什麼呢?我們先看一下下面這張表,這是N=5的情況:
自願者選的牌術師選的牌助手所看到的牌
1,2,2
1,2,4
1,2,5
1,3,3
1,3,5
1,4,5
2,3,3
2,3,5
2,4,4
3,4,4
其中,自願者選的牌-術師選的牌=助手所看到的牌。表中包括了自願者選牌的所有可能性,它們兩兩不同。而助手所看到的牌,也是兩兩不同的。
首先,術師和他的助手都要記住這張表。這樣,當助手看到的牌是2,4時,她就可以肯定自願者選的牌是2,4,5,且術師選的牌就是5。
現在,告訴你n的值,要你求出這張表。其中n≤15。為了便於分析,我們令M表示從N張牌中選取(N+1)/2張牌的方案數,顯然,從這N張牌中選出(N+1)/2-1張牌的方案數也是M。
我們先從枚舉的角度入手,下面給出兩種枚舉的方法:
對於自願者的每種選牌的方案,枚舉術師所選的牌。
如何測試兩個人的匹配度
對於自願者的每種選牌的方案,所對應的助手看到的牌。
方案一需要M次決策,每次決策中有N種選擇;方案二同樣需要M次決策,而每次決策的可以有M種選擇。從這點上來看,方案一要好得多。、
可是方案一所表現出來的「自願者的選牌的方案」和「術師所選的牌」之間的關系並不是一一對應的關系,對於自願者不同的選牌的方案,術師可以選擇相同的牌。
而方案二中所表現出的關系正是一一對應的關系,因為題目要求對於自願者不同的選牌的方案,助手看到的牌必須不同。
前面已經提到過,從信息學的角度來看,一一對應,也可以看作是一種二分圖的匹配的關系。因此,方案二更容易讓人聯繫到匹配。
令X=自願者的選牌的方案集,Y=助手看到的牌的,構造二分圖G=(X,Y,E),當且僅當時,G中存在邊xiyj。這樣,就把原問題轉換成求圖G的一個完美匹配。
下面問題又來了。首先,二分圖的頂點高達2M個,當N=15時,M接近,而求匹配的復雜度為O(M3),這樣高的復雜度,如何能夠承受?
注意到這個圖是一個稀疏圖,一共只有MN條邊。而稀疏二分圖匹配的復雜度也可以表示成O(|V|×|E|)。因此,時間復雜度應該是O(),基本上可以承受了。
另外,由於這是稀疏圖,我們用鄰接表來存儲,則空間復雜度僅為O(NM),同樣可以承受。
要說明的是,這道題目也可以用構造法以更好的效率,但不如匹配容易想到。具體的構造方法這里就不給出了,讀者可以自己想一想。問題:OOPC-神秘之山
M個人在追一隻奇怪的小動物。眼看就要追到了,那小東西卻一溜煙躥上一座神秘的山。眾人抬頭望去那山看起來就是這個樣子:
圖表7樣例示意圖
那山由N+1條線段組成。各個端點從左到右編號為0…N+1,即x<x[i+1](0≤i≤n)。而且有y[0]=y[n+1]=0。
根據經驗來說那小東西極有可能在1…N中的某個端點。有趣的是大家很快發現了原來M恰好等於N,這樣,他們決定每人選一個點,看看它是否在躲那裡。
一開始,他們都在山腳下,第i個人的位置是(s,0)。他們每人選擇一個中間點(x,0),先以速度w水平走到那裡,再一口氣沿直線以速度c爬到他的目的地。由於他們的數學不好,他們只知道如何選擇一個的整數來作為中間點的橫坐標x。而且很明顯,路線的任何一個部分都不能在山的上方(他們又不會飛)。
他們不希望這次再失敗了,因此隊長決定要尋找一個方案,使得一個到達目的地的人盡量早點到。他們該怎麼做呢?
其中1≤N≤,0≤x,y,s≤,1≤c<w≤。行包含一個整數N。以下N+2行每行,包含兩個整數xi和yi,代表相應端點的坐標。以下N行每行包含3個整數:ci,wi和si,代表第i個人的爬山速度,行走速度和初始位置輸出一個人到達目的地的最早可能時間,四捨五入到小數點後兩位。
樣例輸入
樣例輸出
1.43
樣例說明
在這里例子中,個人先到(5.0)再爬到端點2;第二個人直接爬到端點3;第三個人先到(4.0)再爬到端點1。如下圖:
圖表8樣例的解答題目中的數據繁多復雜,我們先把他們提出來一個個分析:
人,共n個,與之有關的有初始橫坐標s,速度w和c
山頭,共n個,與之有關的有坐標x和y
根據這些信息,可以得到,人和山頭的關系:t[I,J],表示第i個人到達山頭j所需的最短時間。
題目中已經指明是一個人負責一個山頭,這顯然是一個一一對應的關系,因此,我們可以從二分圖的匹配的角度來考慮這個問題。
那麼,這道題目屬於哪一種匹配呢?是簡單的匹配,還是權匹配,或者是前面所提到的「完美」權匹配呢?
其實都不是。因為一般的權匹配,一個匹配的權的定義是該匹配中所有邊上權的和,而這道題目,一個匹配的權是指該匹配的邊上權值的值。題目要求這個值最小,我們暫且稱之為「最小匹配」。
直接求解似乎不太方便。換一個角度,如果我們給出一個時間,就可以用完美匹配的演算法來判斷能否在這個時間內完成所有的工作。
具體的來說,對於給定的二分圖G和時間T,我們可以導出新的圖G』,G』中所有邊的權都不超過T。如果G』存在完美匹配,則所有工作可以在T時間內完成,否則則不能。
這樣,一個簡單的演算法就誕生了:依次增加T,知道求出一個完美匹配為止。由於二分圖中的邊不會超過n2,因此T最多增加n2次,而每次增加T的值,需要O(n2)的時間來找增廣鏈,這樣總的時間復雜度就是O(n4)。
我們還可以採用二分查找的方法來尋找這個T,這樣的演算法時間復雜度就可以降到為O()。
以上就是與兩個人容貌上匹配程度相關內容,是關於兩個人容貌上匹配程度的分享。看完兩個人之間的匹配度後,希望這對大家有所幫助!
㈢ LMS自適應演算法分析及在數字濾波器設計中的應用
自適應過程一般採用典型LMS自適應演算法,但當濾波器的輸入信號為有色隨機過程時,特別是當輸入信號為高度相關時,這種演算法收斂速度要下降許多,這主要是因為輸入信號的自相關矩陣特徵值的分散程度加劇將導致演算法收斂性能的惡化和穩態誤差的增大。此時若採用變換域演算法可以增加演算法收斂速度。變換域演算法的基本思想是:先對輸入信號進行一次正交變換以去除或衰減其相關性,然後將變換後的信號加到自適應濾波器以實現濾波處理,從而改善相關矩陣的條件數。因為離散傅立葉變換�DFT本身具有近似正交性,加之有FFT快速演算法,故頻域分塊LMS�FBLMS演算法被廣泛應用。
FBLMS演算法本質上是以頻域來實現時域分塊LMS演算法的,即將時域數據分組構成N個點的數據塊,且在每塊上濾波權系數保持不變。其原理框圖如圖2所示。FBLMS演算法在頻域內可以用數字信號處理中的重疊保留法來實現,其計算量比時域法大為減少,也可以用重疊相加法來計算,但這種演算法比重疊保留法需要較大的計算量。塊數據的任何重疊比例都是可行的,但以50%的重疊計算效率為最高。對FBLMS演算法和典型LMS演算法的運算量做了比較,並從理論上討論了兩個演算法中乘法部分的運算量。本文從實際工程出發,詳細分析了兩個演算法中乘法和加法的總運算量,其結果為:
復雜度之比=FBLMS實數乘加次數/LMS實數乘加次數=(25Nlog2N+2N-4)/[2N(2N-1)]�
採用ADSP的c語言來實現FBLMS演算法的程序如下:
for(i=0;i<=30;i++)
{for(j=0;j<=n-1;j++)
{in[j]=input[i×N+j;]
rfft(in,tin,nf,wfft,wst,n);
rfft(w,tw,wf,wfft,wst,n);
cvecvmlt(inf,wf,inw,n);
ifft(inw,t,O,wfft,wst,n);
for(j=0,j<=N-1;j++)
{y[i×N+j]=O[N+j].re;
e[i×N+j]=refere[i×N+j]-y[i×N+j];
temp[N+j]=e[i×N+j;}
rfft(temp,t,E,wfft,wst,n);
for(j=0;j<=n-1;j++)
{inf_conj[j]=conjf(inf[j]);}��
cvecvmlt(E,inf_conj,Ein,n);
ifft(Ein,t,Ein,wfft,wst,n);
for(j=0;j<=N-1;j++)
{OO[j]=Ein[j].re;
w[j]=w[j]+2*u*OO[j];}��
}
在EZ-KIT測試板中,筆者用匯編語言和C語言程序分別測試了典型LMS演算法的運行速度,並與FBLMS演算法的C語言運行速度進行了比較,表2所列是其比較結果,從表2可以看出濾波器階數為64時,即使是用C語言編寫的FBLMS演算法也比用匯編編寫的LMS演算法速度快20%以上,如果濾波器的階數更大,則速度會提高更多。
㈣ 最壞適應演算法 c語言
/**------------------------------------------------------
進入程序後可以根據菜單選項進入不同的模塊
1.使用首次適應演算法分配空間
2.使用最佳適應演算法分配空間
3.釋放一塊空間
4.顯示內存分配情況
5.退出系統
----------------------------------------------------------**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MEMSIZE 100 /*定義內存大小為100*/
#define MINSIZE 2 /*如果小於此值 將不再分割內存*/
typedef struct _MemoryInfomation{/* 內存空間分區表 結構*/
int start; /*起始地址*/
int size; /*大小*/
char info; /*狀態 F:空閑(Free) U:佔用(Used) E 結束(end)*/
}MEMINFO;
MEMINFO MemList[MEMSIZE]; //內存空間信息表
void Display();
/*--------------------------------------------------------
函數名:InitALL()
功 能:初始化所有變數
--------------------------------------------------------*/
void InitAll(){
int i;
MEMINFO temp={0,0,'e'};
for(i=0;i<MEMSIZE;i++) //初始化空間信息表
MemList[i]=temp;
MemList[0].start=0; //起始地址為0
MemList[0].size=MEMSIZE;//空間初始為最大的
MemList[0].info='f'; //狀態為空閑
}
/*--------------------------------------------------------
函數名:FirstFit_new()
功 能:首次適應演算法分配內存
--------------------------------------------------------*/
void FirstFit_new(){
int i,j,size;
char temp[10];
printf("FirstFit_new:How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字元串轉化為整數
for(i=0; i < MEMSIZE-1 && MemList[i].info != 'e';i++) //到了空間尾且沒有空間分配
{
if(MemList[i].size >= size && MemList[i].info=='f') //滿足所需要的大小,且是空閑空間
{
if(MemList[i].size - size <= MINSIZE) //如果小於規定的最小差則將整個空間分配出去
MemList[i].info='u'; //標志為使用
else
{
for(j = MEMSIZE-2; j > i; j--) //將i後的信息表元素後移
{
MemList[j+1]=MemList[j];
}
//將i分成兩部分,使用低地址部分
MemList[i+1].start= MemList[i].start+size;
MemList[i+1].size = MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
break;
}
}
if(i == MEMSIZE-1 || MemList[i].info=='e') //沒有找到符合分配的空間
{
printf("Not Enough Memory!!\n");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數名:BestFit_new()
功 能:最佳適應演算法分配內存
--------------------------------------------------------*/
void BestFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BestFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字元串轉化為整數
j=0;
flag=0; //標志是否有合適的空間分配,0無,1有
k=MEMSIZE; //用來保存滿足要求的最小空間
for(i=0;i<MEMSIZE-1 && MemList[i].info!='e';i++)
{
if(MemList[i].size >= size && MemList[i].info == 'f') //符合要求
{
flag=1;
if(MemList[i].size < k) //比符合要求的最小空間小,則交換
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag == 0) //沒找到
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size - size <= MINSIZE) //小於規定的最小差,將整個空間分配
MemList[i].info='u';
else
{
for(j = MEMSIZE-2; j > i; j--) //後移
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
最壞適應演算法
*/
void BadFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BadFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp);
j=0;
flag=0;
k=0; //保存滿足要求的最大空間
for(i=0;i<MEMSIZE-1&&MemList[i].info!='e';i++)
{
if(MemList[i].size>=size&&MemList[i].info=='f')
{
flag=1;
if(MemList[i].size>k)
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag=0)
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size-size<=MINSIZE)
MemList[i].info='u';
else
{
for(j=MEMSIZE-2;j>i;j--)
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
函數名:del()
功 能:釋放一塊內存
--------------------------------------------------------*/
void del()
{
int i,number;
char temp[10];
printf("\nplease input the NUMBER you want stop:");
gets(temp);
number=atoi(temp);
if(MemList[number].info == 'u') //輸入的空間是使用的
{
MemList[number].info = 'f'; //標志為空閑
if(MemList[number+1].info == 'f') //右空間為空則合並
{
MemList[number].size+=MemList[number+1].size; //大小合並
for(i=number+1;i < MEMSIZE-1 && MemList[i].info !='e';i++)/* i後的空間信息表元素前移 */
if(i>0)
MemList[i]=MemList[i+1];
}
if(number > 0 && MemList[number-1].info=='f') //左空間空閑則合並
{
MemList[number-1].size+=MemList[number].size;
for(i=number;i<MEMSIZE-1&&MemList[i].info!='e';i++)
MemList[i]=MemList[i+1];
}
}
else
{
printf("Thist Number is Not exist or is Not used!\n ");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數名:Display()
功 能:顯示內存狀態
--------------------------------------------------------*/
void Display(){
int i,
used=0; //記錄可以使用的總空間量
/* clrscr();*/
printf("\n----------------------------------------------\n");
printf("%5s%15s%15s","Number","start","size","Info");
printf("\n----------------------------------------------\n");
for(i=0;i < MEMSIZE && MemList[i].info != 'e';i++)
{
if(MemList[i].info == 'u')
used+=MemList[i].size;
printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].size,MemList[i].info=='u'?"USED":"FREE");
}
printf("\n----------------------------------------------\n");
printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);
printf("\n\n Press Any Key to return...");
getch();
}
/*--------------------------------------------------------
函數名:main()
功 能:主函數
--------------------------------------------------------*/
void main(){
char ch;
InitAll();
while(1){
printf("========================================================\n");
printf(" 1.Get a block use the FISTFIT method\n");
printf(" 2.Get a block use the BESTFIT method\n");
printf(" 3.Get a block use the BadFIT method\n");
printf(" 4.Free a block\n");
printf(" 5.Display Mem info \n");
printf(" 6.Exit \n");
printf("========================================================\n");
ch=getch();
switch(ch){
case '1':FirstFit_new();break; //首次適應演算法
case '2':BestFit_new();break; //最佳適應演算法
case '3':BadFit_new();break; //最壞適應演算法
case '4':del();break; //刪除已經使用完畢的空間
case '5':Display();break; //顯示內存分配情況
case '6':exit(0);
}
}
}
㈤ 什麼是最優適應分配演算法
最佳適應演算法是從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區的一種計算方法,這種方法能使碎片盡量小。
最佳適應演算法(Best Fit):
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小。為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留大的空閑區,但造成許多小的空閑區。
Best fit演算法等價於裝箱問題,舉例如下:
裝箱問題:有體積為V的箱子N個,體積為Vi的物品M個,求使得物品全部能夠裝入箱子,箱子數量的最小值。
假設 V=6 N=10,V1,V2,...,V10分別為:3 4 4 3 5 1 2 5 3 1。計算過程如下:
第一步按物品體積降序排序:5 5 4 4 3 3 3 2 1 1
第二步:取未裝箱的最大值5裝入第一個箱子。
第三步:判斷第一個箱子是否已滿,不滿且剩餘空間為1,搜尋剩下體積小於等於1的物品填入箱子1,箱子1填滿。
第四步:重復第二,第三步,直到所有物品裝入箱子為止,得到箱子數量為6.
6即時本例N的最小值。
㈥ 最差適配的平均查找長度
n個節點的二叉排序樹在最壞的情況下的平均查找長度為(n+1)/2。
二叉排序樹每個結點的C(i)為該結點的層次數。最壞情況下,當先後插入的關鍵字有序時,構成的二叉排序樹蛻變為單支樹,樹的深度為其平均查找長度(n+1)/2(和順序查找相同),最好的情況是二叉排序樹的形態和折半查找的判定樹相同,其平均查找長度和log 2 (n)成正比。
計算方法
最差適應演算法(Worst Fit)為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按大小從大到小進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。該演算法保留小的空閑區,盡量減少小的碎片產生。
最差適應演算法,也稱最差適配演算法,它從全部空閑區中找出能滿足作業要求的、且大小最大的空閑分區,從而使鏈表中的結點大小趨於均勻,適用於請求分配的內存大小范圍較窄的系統。
㈦ 最差適配演算法【在線等+急+高分】
它從全部空閑區中找出能滿足作業要求的、且大小最大的空閑分區,從而使鏈表中的結點大小趨於均勻,適用於請求分配的內存大小范圍較窄的系統。為適應此演算法,空閑分區表(空閑區鏈)中的空閑分區要按大小從大到小進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。
所以從頭查到尾,只要有合適的,他就會匹配。並且還要求節點大小趨於均勻這個特點
㈧ 最先適應,下次適應,最佳和私營,最壞適應四種分配演算法中,哪一種更適合固定分區存儲管理系統為什麼
固定分區存儲管理系統適合採用最佳適應演算法。因為,此演算法所產生的內碎片最少。
這里還要介紹一下下次適應演算法。下次適應(next fit)演算法也稱「臨近適應」演算法,其工作方式和最先適應演算法相同(最先適應也稱首次適應演算法。它總是最先找到的、滿足存儲要求的那個空閑分區作為分配對象。),不同的是每次找到合適的空閑的分區時就記住它的位置,以便下次就從該位置開始往下查找,而不是每次都像最先適應演算法那樣從頭開始查找。但是這種演算法的總體結果通常要比最先適應演算法差。由於它經常會在內存的末尾分配存儲分區,使位於存儲空間末尾的最大分區被撕裂成小的外部碎片,因此必須經常不斷地進行存儲緊湊。在該演算法中應採取循環查找方式,即最後上個空閑區的大小仍不能滿足要求時,應再從第一個空閑區開始查找,故又稱為循環造就演算法
㈨ 可變分區管理內存分配演算法有那些,各有什麼有缺點
連續分配: 首次適應演算法(較快,簡單,碎片多),最大適應分配演算法(以期不留下小碎片), 最佳適應分配演算法(慢,復雜,碎片少)。 都需要碎片整理。
離散分配:分段管理(邏輯性好),分頁管理,段頁式管理(最好,當然也復雜)。