㈠ 蠻力法是什麼樣的演算法
《演算法設計與分析基礎》學習 --- 蠻力法 要重溫演算法思想,並以《演算法設計與分析基礎》這本書作為教材。該書每一章介紹一種演算法設計思想。今天從最簡單的開始寫起,打好基礎。以後再逐步深入,學習更深入的演算法。 蠻力法就是一種解決問題的最簡單最直觀的最容易理解方法,雖然它簡單,而且在實際應用中因為效率的原因可能不能派上用場,但是還是不能忽略它。正如書中作者所說,在解決小規模問題的時候也不失為一個方法,而且也是更復雜演算法的基礎。 一、選擇排序
以最簡單的思路解決排序問題,對於N個元素的數組,通過N次掃描數組,每次選擇出最小的元素放置到正確的位置,N趟掃描後即完成排序。 show sourceview source print? 01/* 02 蠻力法-選擇排序 03 將輸入數組排成非遞減數組 04 05 array:待排數組 06 n:數組大小,即[0,n-1] 07*/08void SelectionSort(int array[],unsigned int n) 09{ 10 int min; 11 for(int i=0;i<n-1;i++) 12 { 13 min=i; 14 for(int j=i+1;j<n;j++) 15 { 16 if(array[j]<array[min]) 17 min = j; 18 } 19 if(i!=min) 20 { 21 int temp = array[i]; 22 array[i] = array[min]; 23 array[min] = temp; 24 } 25 } 26}//SelectionSort
這是一個最差的排序方法,對於任何輸入都是 O(n*n)的時間復雜度。但是它的最大優點就是交換次數最少。 二、冒泡排序
又是一個經典的蠻力排序演算法。這里我僅僅對原始的冒泡做了點點改進,如果演算法已經排好序的話該演算法掃描一遍便完成排序。
show sourceview source print? 01/* 02 蠻力法-冒泡排序(稍微改進版) 03 將輸入數組排成非遞減數組 04 05 array:待排數組 06 n:數組大小,即[0,n-1] 07*/08void BubbleSort(int array[],unsigned int n) 09{ 10 int i=n-1; 11 int last; 12 while(i>0) 13 { 14 last = 0; 15 for(int j=0;j<i;j++) 16 { 17 if(array[j]>array[j+1]) 18 { 19 int temp = array[j]; 20 array[j] = array[j+1]; 21 array[j+1] = temp; 22 23 last = j; //記錄最近一次交換值的位置 24 } 25 } 26 i = last; 27 } 28}//BubbleSort
但是在最差的情況下,它還是O(n*n)的時間復雜度。 三、順序查找和字元串的蠻力匹配
順序查找,再簡單不過的查找演算法了,算是對蠻力思想的一種應用。以及字元串的蠻力匹配也是這樣的。
㈡ 簡要敘述蠻力法,基本常用的例子有哪些
蠻力法(brute force method,也稱為窮舉法或枚舉法)是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以,蠻力法也是最容易應用的方法。
蠻力法特性:
(1)理論上,蠻力法可以解決可計算領域的各種問題。
(2)蠻力法經常用來解決一些較小問規模的問題。
(3)對於一些重要的問題(如排序、查找、串匹配),蠻力法可以設計一些合理的演算法,這些演算法具有實用價值,而且不受輸入規模的限制。
(4)蠻力法可以作為某類問題時間性能的下界,來衡量同樣問題的其他演算法是否具有更高的效率。
查找問題中使用蠻力法。
順序查找:
是指在查找集合中一次查找值為k的元素,若查找成功,則給出元素在查找集合中的位置;若查找失敗,則給出失敗信息。
【想法】:將查找集合放在一維數組中,然後從數組的一端向另一端逐個將元素與帶查找值進行比較,若相等,則查找成功,給出該元素在查找中的序號;若整個數組檢測完仍未找到與帶差值相等的元素,則查找失敗,給出失敗標志0。我們在查找過程中還要注意下標是否越界的問題。
演算法的實現方法一:
int SeqSearch1(int r[] ,int n, int k) //數組r[1] r[n]中存放查找集合。
{
int i = n;
while(i>0 && r[i]!k) //注意檢測比較位置是否越界。
{ i--; }
return i;
}
上述演算法我們每次都要去判斷數組的下標是否越界,為了避免在查找過程中每一次比較前都要判斷查找位置是否越界,可以設置觀察哨,即將待查值放在查找方向的「盡頭」處,則比較位置i至多移動到下標0處。
㈢ C語言暴力
所謂的暴力演算法,就是用窮舉的方法解決問題。
例如,如果讓你驗證一個數num是否為素數,暴力演算法就是窮舉2->num-1的每一個值,然後看這些值有沒有num的因子。當窮舉結束時就可以判斷num是不是素數了。
㈣ bf演算法是什麼
BF演算法,即暴力(Brute Force)演算法。
是普通的模式匹配演算法,BF演算法的思想就是將目標串S的第一個字元與模式串T的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和 T的第二個字元;若不相等,則比較S的第二個字元和T的第一個字元,依次比較下去,直到得出最後的匹配結果。BF演算法是一種蠻力演算法。
如果一個多位數並且包含以上所有可能字元的密碼,其組合方法一定多的驚人,且每增加一位數,密碼組合數量會以數十倍指數成長,破譯的時間也會更長,有時可能長達數十年(即便考慮電腦性能依摩爾定律的進步),甚至更久。
由於窮舉法破解所消耗的時間不小於完成破解所需要的多項式時間,故從密碼學角度考慮,不認為窮舉法是有效的破解方法。
字典攻擊
破譯一個相當長度並且包含各種可能字元的密碼所耗費的時間相當長,其中一個解決辦法就是運用字典。所謂「字典攻擊」就是使用預先製作好的清單,例如:英文單字、生日的數字組合、以及各種常被使用的密碼,等等,利用一般人習慣設置過短或過於簡單的密碼進行破譯,很大程度上縮短了破譯時間。
防護手段
最重要的手段是在構建系統時要將系統設計目標定為即便受到暴力破解的攻擊也難以被攻破。以下列舉了一些常用的防護手段:
1、增加密碼的長度與復雜度。
2、在系統中限制密碼嘗試的次數。
3、密碼驗證時,將驗證結果不是立即返回而是延時若干秒後返回。
4、限制允許發起請求的客戶端的范圍。
5、禁止密碼輸入頻率過高的請求。
6、將密碼設置為類似安全令牌那樣每隔一定時間就發生變化的形式。
7、當同一來源的密碼輸入出錯次數超過一定閾值,立即通過郵件或簡訊等方式通知系統管理員。
8、人為監視系統,確認有無異常的密碼試錯。
9、使用雙因子認證,例如用戶登錄賬號密碼時,系統同時發送簡訊到用戶的手機,用戶需輸入簡訊內的認證碼。
㈤ 動態規劃演算法中的狀態與蠻力法中的窮舉對象,有什麼異同
線性規模、作用。
1、異點:動態規劃演算法中的狀態由於是動態的,所以線性規模會表現出很大的狀態,蠻力法中的窮舉對象適用於解決極小規模或者復雜度線性增長,而線性規模不會有很大的狀態。
2、同點:動態規劃演算法中的狀態與蠻力法中的窮舉對象共同的作用就是為了解決問題。