當前位置:首頁 » 操作系統 » 演算法同種

演算法同種

發布時間: 2023-02-15 06:12:42

『壹』 求一種加密演算法,要求可以用同一種演算法逆向,且文件大小不變

異或運算。加密學的書第1個介紹的就是這種演算法。
只是加密效果不好,很容易分析出原文。
想設計強度更高的演算法,建議看下加密方面的數學書。

『貳』 操作系統之 同步各種演算法

生產者消費者問題是經典的多線程並發訪問問題
生產者生產產品,消費者消費產品, 兩者的資源存儲在同一個資源池。
因此,問題來了,生產者生產商品需要在資源池的存儲范圍內;然而消費者消費的資源需要在資源池不為空的前提下。由於兩者均會對資源池造成修改,為了保證統一性,因此,兩者需要互斥訪問,同時,生產者生產產品需要對生產數量資源進行更改,因此生產者也需要互斥訪問。

假設有 5 個哲學家,他們的生活只是思考和吃飯。這些哲學家共用一個圓桌,每位都有一把椅子。在桌子中央有一碗米飯,在桌子上放著 5 根筷子(圖 1 )。

當一位哲學家思考時,他與其他同事不交流。時而,他會感到飢餓,並試圖拿起與他相近的兩根筷子(筷子在他和他的左或右鄰居之間)。一個哲學家一次只能拿起一根筷子。顯然,他不能從其他哲學家手裡拿走筷子。當一個飢餓的哲學家同時擁有兩根筷子時,他就能吃。在吃完後,他會放下兩根筷子,並開始思考。

哲學家就餐問題是一個經典的同步問題,這不是因為其本身的實際重要性,也不是因為計算機科學家不喜歡哲學家,而是因為它是大量並發控制問題的一個例子。這個代表型的例子滿足:在多個進程之間分配多個資源,而且不會出現死鎖和飢餓。

一種簡單的解決方法是每隻筷子都用一個信號量來表示。一個哲學家通過執行操作 wait() 試圖獲取相應的筷子,他會通過執行操作 signal() 以釋放相應的筷子。

雖然這一解決方案保證兩個鄰居不能同時進食,但是它可能導致死鎖,因此還是應被拒絕的。假若所有 5 個哲學家同時飢餓並拿起左邊的筷子。所有筷子的信號量現在均為 0。當每個哲學家試圖拿右邊的筷子時,他會被永遠推遲。

死鎖問題有多種可能的補救措施:

有讀者和寫者兩組並發進程,共享一個文件,當兩個或以上的讀進程同時訪問共享數據時不會產生副作用,但若某個寫進程和其他進程(讀進程或寫進程)同時訪問共享數據時則可能導致數據不一致的錯誤。因此要求:①允許多個讀者可以同時對文件執行讀操作;②只允許一個寫者往文件中寫信息;③任一寫者在完成寫操作之前不允許其他讀者或寫者工作;④寫者執行寫操作前,應讓已有的讀者和寫者全部退出。

關系分析。由題目分析讀者和寫者是互斥的,寫者和寫者也是互斥的,而讀者和讀者不存在互斥問題。

整理思路。兩個進程,即讀者和寫者。寫者是比較簡單的,它和任何進程互斥,用互斥信號量的P操作、V操作即可解決。讀者的問題比較復雜,它必須實現與寫者互斥的同時還要實現與其他讀者的同步,因此,僅僅簡單的一對P操作、V操作是無法解決的。那麼,在這里用到了一個計數器,用它來判斷當前是否有讀者讀文件。當有讀者的時候寫者是無法寫文件的,此時讀者會一直佔用文件,當沒有讀者的時候寫者才可以寫文件。同時這里不同讀者對計數器的訪問也應該是互斥的。

信號量設置。首先設置信號量count為計數器,用來記錄當前讀者數量,初值為0; 設置mutex為互斥信號量,用於保護更新count變數時的互斥;設置互斥信號量rw用於保證讀者和寫者的互斥訪問。

在上面的演算法中,讀進程是優先的,也就是說,當存在讀進程時,寫操作將被延遲,並且只要有一個讀進程活躍,隨後而來的讀進程都將被允許訪問文件。這樣的方式下,會導致寫進程可能長時間等待,且存在寫進程「餓死」的情況。

如果希望寫進程優先,即當有讀進程正在讀共享文件時,有寫進程請求訪問,這時應禁止後續讀進程的請求,等待到已在共享文件的讀進程執行完畢則立即讓寫進程執行,只有在無寫進程執行的情況下才允許讀進程再次運行。為此,增加一個信號量並且在上面的程序中 writer()和reader()函數中各增加一對PV操作,就可以得到寫進程優先的解決程序。

考慮下面一種情況:當讀者佔領資源,並且等待者中既有讀者又有寫者時,第一種演算法會出現什麼情況呢?

答案自然是,由於讀者已經通過更改信號量wrt使得寫者無法進行寫操作,無論隊列中讀者和寫者的順序如何,都會讓讀者進入的。

這樣下去如果一直有讀者在隊列中,或者說一直有讀線程產生,那寫線程將一直執行不了,而被「餓死」。

為了避免這種情況的產生,我們定義了一種信號量-「隊列鎖」(queue),用來標識是否排隊排到自己;當排到一個寫者時,寫者將更改這個信號量,使得在它被執行之前,後面的讀者不會「插隊」

『叄』 C語言中 什麼是演算法 演算法的表示有哪幾種方式

演算法(Algorithm)是一系列解決問題的清晰指令.
演算法也可以理解為有基本運算及規定的運算順序所構成的完整的解題步驟.或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題.
一個演算法應該具有以下五個重要的特徵:有窮性,確切性,輸入,輸出,可行性.
演算法可以使用自然語言、偽代碼、流程圖,或者程序語言(比如C,C++)等多種不同的方法來描述.

『肆』 同一種演算法可以隨意

設男人X人,女人Y人,則小孩有100-X-Y人
4X+2Y+(100-X-Y)/2=100
7X+3Y=100
Y=(100-7X)/3
因為X、Y都是非負整數,所以100-7X≥0
X≤100/7
因此X是0到14之間的整數
且100-7X是3的倍數
100÷3餘1,所以7X÷3也餘1
因此X最小可以為1,且為保證余數不變,X每次增加3
因此有:(1)X=1,Y=31,小孩有68人
(2)X=4,Y=24,小孩有72人
(3)X=7,Y=17,小孩有76人
(4)X=10,Y=10,小孩有80人
(5)X=13,Y=3,小孩有84人
共5種可能
這個屬於分析不定方程

『伍』 幾種常用的演算法簡介

1、窮舉法窮舉法是最基本的演算法設計策略,其思想是列舉出問題所有的可能解,逐一進行判別,找出滿足條件的解。
窮舉法的運用關鍵在於解決兩個問題:
在運用窮舉法時,容易出現的問題是可能解過多,導致演算法效率很低,這就需要對列舉可能解的方法進行優化。
以題1041--純素數問題為例,從1000到9999都可以看作是可能解,可以通過對所有這些可能解逐一進行判別,找出其中的純素數,但只要稍作分析,就會發現其實可以大幅度地降低可能解的范圍。根據題意易知,個位只可能是3、5、7,再根據題意可知,可以在3、5、7的基礎上,先找出所有的二位純素數,再在二位純素數基礎上找出三位純素數,最後在三位純素數的基礎上找出所有的四位純素數。
2、分治法分治法也是應用非常廣泛的一種演算法設計策略,其思想是將問題分解為若乾子問題,從而可以遞歸地求解各子問題,再綜合出問題的解。
分治法的運用關鍵在於解決三個問題:
我們熟知的如漢諾塔問題、折半查找演算法、快速排序演算法等都是分治法運用的典型案例。
以題1045--Square
Coins為例,先對題意進行分析,可設一個函數f(m,
n)等於用面值不超過n2的貨幣構成總值為m的方案數,則容易推導出:
f(m,
n)
=
f(m-0*n*n,
n-1)+f(m-1*n*n,
n-1)+f(m-2*n*n,
n-1)+...+f(m-k*n*n,
n-1)
這里的k是幣值為n2的貨幣最多可以用多少枚,即k=m/(n*n)。
也很容易分析出,f(m,
1)
=
f(1,
n)
=
1
對於這樣的題目,一旦分析出了遞推公式,程序就非常好寫了。所以在動手開始寫程序之前,分析工作做得越徹底,邏輯描述越准確、簡潔,寫起程序來就會越容易。
3、動態規劃法
動態規劃法多用來計算最優問題,動態規劃法與分治法的基本思想是一致的,但處理的手法不同。動態規劃法在運用時,要先對問題的分治規律進行分析,找出終結子問題,以及子問題向父問題歸納的規則,而演算法則直接從終結子問題開始求解,逐層向上歸納,直到歸納出原問題的解。
動態規劃法多用於在分治過程中,子問題可能重復出現的情況,在這種情況下,如果按照常規的分治法,自上向下分治求解,則重復出現的子問題就會被重復地求解,從而增大了冗餘計算量,降低了求解效率。而採用動態規劃法,自底向上求解,每個子問題只計算一次,就可以避免這種重復的求解了。
動態規劃法還有另外一種實現形式,即備忘錄法。備忘錄的基本思想是設立一個稱為備忘錄的容器,記錄已經求得解的子問題及其解。仍然採用與分治法相同的自上向下分治求解的策略,只是對每一個分解出的子問題,先在備忘錄中查找該子問題,如果備忘錄中已經存在該子問題,則不須再求解,可以從備忘錄中直接得到解,否則,對子問題遞歸求解,且每求得一個子問題的解,都將子問題及解存入備忘錄中。
例如,在題1045--Square
Coins中,可以採用分治法求解,也可以採用動態規劃法求解,即從f(m,
1)和f(1,
n)出發,逐層向上計算,直到求得f(m,
n)。
在競賽中,動態規劃和備忘錄的思想還可以有另一種用法。有些題目中的可能問題數是有限的,而在一次運行中可能需要計算多個測試用例,可以採用備忘錄的方法,預先將所有的問題的解記錄下來,然後輸入一個測試用例,就查備忘錄,直接找到答案輸出。這在各問題之間存在父子關系的情況下,會更有效。例如,在題1045--Square
Coins中,題目中已經指出了最大的目標幣值不超過300,也就是說問題數只有300個,而且各問題的計算中存在重疊的子問題,可以採用動態規劃法,將所有問題的解先全部計算出來,再依次輸入測試用例數據,並直接輸出答案。
4、回溯法回溯法是基於問題狀態樹搜索的求解法,其可適用范圍很廣。從某種角度上說,可以把回溯法看作是優化了的窮舉法。回溯法的基本思想是逐步構造問題的可能解,一邊構造,一邊用約束條件進行判別,一旦發現已經不可能構造出滿足條件的解了,則退回上一步構造過程,重新進行構造。這個退回的過程,就稱之為回溯。
回溯法在運用時,要解決的關鍵問題在於:
回溯法的經典案例也很多,例如全排列問題、N後問題等。
5、貪心法貪心法也是求解最優問題的常用演算法策略,利用貪心法策略所設計的演算法,通常效率較高,演算法簡單。貪心法的基本思想是對問題做出目前看來最好的選擇,即貪心選擇,並使問題轉化為規模更小的子問題。如此迭代,直到子問題可以直接求解。
基於貪心法的經典演算法例如:哈夫曼演算法、最小生成樹演算法、最短路徑演算法等。

『陸』 五種常用演算法

五種常用演算法主要有以下幾種:

1.回歸演算法。回歸演算法是試圖採用對誤差的衡量來探索變數之間的關系的一類演算法,是統計機器學習的利器。

2.基於實例的演算法。基於實例的演算法常常用來對決策問題建立模型,這樣的模型常常先選取一批樣本數據,然後根據某些近似性把新數據與樣本數據進行比較。用戶通過這種方式來尋找最佳的匹配,因此,基於實例的演算法常常也被稱為「贏家通吃」學習或者「基於記憶的學習」。

3.正則化方法。正則化方法是其他演算法(通常是回歸演算法)的延伸,根據演算法的復雜度對演算法進行調整,通常對簡單模型予以獎勵,而對復雜演算法予以懲罰。

演算法分類編輯演算法可大致分為:基本演算法、數據結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法,厄米變形模型,隨機森林演算法。

『柒』 演算法的三種基本結構是

演算法有順序結構、條件分支結構、循環結構三種基本邏輯結構。

1、順序結構:順序結構是最簡單的演算法結構,語句與語句之間,框與框之間是按從上到下的順序進行的,它是由若干個依次執行的處理步驟組成的。

它是任何一個演算法都離不開的一種基本演算法結構。順序結構在程序框圖中的體現就是用流程線將程序框自上而下地連接起來,按順序執行演算法步驟。

2、條件結構:

條件結構是指在演算法中通過對條件的判斷,根據條件是否成立而選擇不同流向的演算法結構。

條件P是否成立而選擇執行A框或B框。無論P條件是否成立,只能執行A框或B框之一,不可能同時執行A框和B框,也不可能A框、B框都不執行。一個判斷結構可以有多個判斷框。

3、循環結構

在一些演算法中,經常會出現從某處開始,按照一定條件,反復執行某一處理步驟的情況,這就是循環結構,反復執行的處理步驟為循環體,顯然,循環結構中一定包含條件結構。循環結構又稱重復結構,循環結構可細分為兩類:

一類是當型循環結構,如下左圖所示,它的功能是當給定的條件P成立時,執行A框,A框執行完畢後,再判斷條件P是否成立,如果仍然成立,再執行A框,如此反復執行A框,直到某一次條件P不成立為止,此時不再執行A框,離開循環結構。

另一類是直到型循環結構,如下右圖所示,它的功能是先執行,然後判斷給定的條件P是否成立,如果P仍然不成立,則繼續執行A框,直到某一次給定的條件P成立為止,此時不再執行A框,離開循環結構。

(7)演算法同種擴展閱讀

共同特點

(1)只有一個入口和出口

(2)結構內的每一部分都有機會被執行到,也就是說對每一個框來說都應當有一條從入口到出口的路徑通過它,如圖中的A,沒有一條從入口到出口的路徑通過它,就是不符合要求的演算法結構。

(3)結構內不存在死循環,即無終止的循環。

『捌』 演算法有什麼分類

演算法可大致分為基本演算法、數據結構的演算法、數論與代數演算法、計算幾何的演算法、圖論的演算法、動態規劃以及數值分析、加密演算法、排序演算法、檢索演算法、隨機化演算法、並行演算法,厄米變形模型,隨機森林演算法。

演算法可以宏泛的分為三類:

一、有限的,確定性演算法 這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。

二、有限的,非確定演算法 這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。

三、無限的演算法 是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的數據滿足而不終止運行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。

(8)演算法同種擴展閱讀:

演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。

演算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化演算法在內的一些演算法,包含了一些隨機輸入。

形式化演算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其後嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。

『玖』 同樣的演算法,用遞歸是不是比遞推慢很多

如果單純的遞歸一定會慢很多,因為你計算時反復計算了一些值,浪費了相當多的時間,
但是優化之後的遞歸和地推效率基本一樣,雖然遞歸要進棧出棧花費時間,且容易因遞歸深度過大而棧溢出.

所謂的優化,就是記憶化,比如遞歸函數是f(a,b)
那麼弄一個數組,f_r[a,b]
每次運行遞歸函數f(a,b)時,檢測f_r[a,b]的值是否已定義,是則返回這個值,否則執行函數,且在函數返回前記錄返回值到f_r[a,b]中.

熱點內容
海量數據如何存儲的 發布:2025-07-29 13:49:56 瀏覽:34
linux安裝依賴包 發布:2025-07-29 13:49:46 瀏覽:294
怎樣賣腳本 發布:2025-07-29 13:34:31 瀏覽:312
安卓視頻助手哪個軟體好 發布:2025-07-29 13:25:23 瀏覽:125
家用寬頻搭建伺服器有用嗎 發布:2025-07-29 13:16:12 瀏覽:806
微愛安卓聊天記錄在哪裡 發布:2025-07-29 13:16:06 瀏覽:584
ins特效安卓手機哪裡有 發布:2025-07-29 13:10:28 瀏覽:493
最好演算法 發布:2025-07-29 13:10:23 瀏覽:336
sql創建表視圖 發布:2025-07-29 13:00:15 瀏覽:750
cp並創建文件夾 發布:2025-07-29 13:00:13 瀏覽:920