最近新學習了一種新的求解的方法,就是暴力搜尋,在通常做題沒有很明確的思路的時候,通常都會採用的一種方式。
我們知道,乙個問題的解空間通常對應的是一棵樹的方式進行組織的,那麼我們可以通過根據題目中的條件描述來掃瞄
樹中的每乙個結點,對應的就是將問題的所有可能的解進行掃瞄一遍,從中選出滿足要求的即為問題的答案了。
這也就是人們常說的搜尋,搜尋的物件是解空間樹。 當然,根據不同的情況而言,樹中的結點個數可能會有很多,
很多情況下,在規定的時間之內是不能夠搜尋到全部的解所對應的頂點的,所以這也就隨之產生了很多中搜尋的方法:
1.暴力搜尋法: 暴力搜尋就是以列舉的方法一一例舉解空間樹上的每乙個結點,直至找到滿足要求的節點
主要有兩種型別題: 1. n個位置上的資料選取x 個,x 為任意數字,對應的n 個資料每個資料,兩種狀態 0 , 1 ,0代表沒有被選取, 1 代表的是選取
這樣的話, n 個資料,對應的可能有 2^n 中可能性,當然解空間樹全部遍歷,對應 2^n 個頂點,當然對應的時間複雜度為 o(2^n)
2. n個位置上的資料全部選取,但是選取的順序不同造成的結果不同------>對應的是對 n 進行全排列的方式,
這種實現方式有兩種,一種是暴力搜尋對應的時間複雜度為 o(n^n). 另一種是 o(n!) ,基於的是 dfs 搜尋的方式。
2.二分搜尋法 :通過每次將所訪問的解空間樹中的結點個數減半,即如果當前正在訪問的是解空間樹中的 i 頂點,
根據題目中所描述的資訊,選取 i 頂點的左子樹或是右子樹,然後丟棄沒有選擇的子樹。對選取的子樹進行同樣的操作。
不過這種搜尋方法要求的是,所搜尋的關鍵字是需要有序排列的,這樣每次在進行二分的時候,
才能夠保證所訪問的樹的頂點 i 的左右子樹的數量都是相同的,並且(左子樹結點值)< i < (右子樹結點值) ,或是另一種序列。
3. dfs 搜尋: 沿著乙個起始訪問點,一直走直到訪問到底為止,深度優先搜尋。
通常實現起來可以通過遞迴的方式來對其進行實現。 也可以使用模擬棧的方式來實現。
4. bfs搜尋: 逐層遍歷搜尋樹中的每乙個結點,bfs通常是用來選取最優解的方式,因為逐層遍歷的方式,如果發現滿足題意的解的話,
該解必定位於的是所有的可能解中的距離根節點最近的乙個結點,所以是最優解。
通常實現的方式是基於 佇列 作為輔助資料結構來實現。
1.暴力搜尋法程式設計小練習:
1.1 已知,乙個揹包能夠存放最大物體的重量為 c , 現在有 n 個物體,對應的重量是 w[ 0 ... n-1], 請你求出,將物體中選取出一些 (x 個, x <= n ),
使得這 x 個物體的總共重量不超過揹包能夠承受的最大的重量c, 求出這個最大的重量。
輸入資料格式
n cw[0] ....w[n-1]
輸出資料的格式
放入包中的物品最大重量值
#include #include #include int ans = 0 ;int n , c , w[1005] ;
void input( )
}void dfs ( int step , int noww )
return ;
} dfs( step+1 , noww) ;
dfs( step+1 , noww+w[step] ) ; }
int main ( void )
1.2 已知,乙個揹包能夠存放最重的重量為 c , 現在有 n 個物體,n 個物體所對應的重量為 w[ 0.. n-1] , 請你求出,在不對每個物品進行分割
並且不超過揹包限定總重量的情況下,能夠存放的最多物品的個數是多少,此時揹包的重量是多少,存放物品的編號是多少( 0...n-1)
輸入資料格式
n cw[0] w[1] ... w[ n-1 ]
輸出資料的格式
最多的物品個數
揹包重量
所存放的物品編重量 ( 0 .. n-1 )
#include #include using namespace std ;
int n , c ;
int w[1001] ;
void input( )
}int cnt = 0 ;
int sum = 0 ;
void fun()
else
break; }}
int main ( void )
else
printf("no") ;
return 0 ;
}
1.3 一直乙個陣列 a[ 0..n-1] 中有 n 個數值,現在給你乙個固定的數值 k, 試問,在陣列 a 中是否存在一組數值使得這些數值的和剛好等於 k
如果存在的話,輸出 yes。 如果不存在的話,則輸出 no
輸入格式
n ka[0] a[1] ... a[n-1]
輸出格式
yesno
#include #include #include using namespace std ;
int a[101] ,n , k ;
bool ok = false ;
void input ()
void dfs ( int step , int v )
dfs( step+1, v+a[step] ) ;
dfs(step+1 , v ) ;
}int main ( void )
else
printf("no") ;
return 0 ;
}
在這裡突然發現乙個問題,dfs 應該在不對其進行剪枝操作的前提下是暴力搜尋的一種特例。
給定乙個數值n, 列印出 n 到 1 的全部全排列
看小說新技能Get 爬蟲練習
想看 但是 的廣告又層出不窮,點一頁出來乙個廣告,攔截廣告的操作我又不是很熟練,那就把 資源移動到沒有廣告的地方吧 我不寫 但我是 的搬運工。搬運第一步,瞄準 開啟f12,看看內容在 nice 竟然光明正大的放在這兒,那就別怪我搬運了 魔鬼臉,嘿嘿 要搬就得全部搬走,先把每一章的 給他搬過來。上搬運...
新技能 get 使用 python 生成詞云
從技術上來看,詞云是一種有趣的資料視覺化方法,網際網路上有很多的現成的工具 coding utf 8 import jieba from wordcloud import wordcloud import matplotlib.pyplot as plt text from file open 檔案...
新技能get 在任意目錄執行NDK編譯
準備環境 首先,你得安裝了android的ndk編譯工具,假設你的ndk的根目錄在 opt android ndk 當然,最好你能在環境變數裡配置一下路徑,否則使用ndk build命令的時候,都得加上路徑的字首了。修改 bashrc export ndk home opt android ndk ...