DS博客做業07--查找

1.本週學習總結

1.1思惟導圖

1.2.談談你對查找運算的認識及學習體會

這幾周學習了查找,像對一個系統之類的進行操做都是增刪改,這些步驟不可缺乏的就是須要查找
在這章的學習裏,有比較熟悉的線性表查找,這和C的內容差很少,比較好理解,就是遍歷查找,只是須要遍歷的次數的算法的改進
數表查找運用了上章學習的樹結構,樹的查找理解起來還行,就是代碼不大會打
二叉排序樹的查找和樹形有關,能夠將其調整爲平衡二叉樹,根據失衡點,進行LL,RR,LR,RL調整
B+,B-樹是用於外查找的,好吧,顯然我不是很懂什麼是內外查找,對於B+,B-樹只是掌握了怎麼增長結點以及刪除結點
哈希表查找,上學期就有提過哈希數組,一種以空間換時間的算法,可使查找達到O(1),可是也有哈希衝突的問題,因此就有相對應的解決衝突的方法
我以爲哈希表查找只要哈希函數構建得好,以及哈希衝突處理的好,應該是這幾種算法裏最快的了

2.PTA實驗做業

2.1.題目1:是否二叉搜索樹

2.1.1設計思路

一開始的思路是根據題目中給的二叉搜索樹的定義,一個一個進行判斷,這樣的代碼比較複雜
後來想起二叉搜索樹的特色,中序遍歷是升序的,只要將中序遍歷獲得的數存入數組,再判斷是不是升序的就能夠了
對二叉樹進行中序遍歷,將獲得的數存進a數組中
for int j=1 to i
    if a[j-1]>=a[j]//若是中序遍歷不是升序的,就不是二叉搜索樹
        return 0;
end for
return 1;

2.1.2代碼截圖

2.1.3本題PTA提交列表說明

A1:第一個提交是用了定義一個一個判斷,第二個提交是用來上述的方法,代碼量也少了不少

2.2 題目2:QQ賬戶的申請與登錄

2.2.1設計思路

一開始的想法是弄兩個輔助數組來存放,而且看是否存在該帳號或者密碼是否正確,而後我發現像這樣作要考慮不少東西頗有可能隕石超時,因而改爲了用C++的map來作
定義結構體Order
定義常量N,以及結構體類型數組,長度爲N,定義map容器
for int i=0 to N do
    輸入命令,賬號,密碼
    若是輸入的命令是登陸
        判斷是否已存在該賬號
            不是的話,提示錯誤
            是的話,判斷密碼是否正確//這個時候就能夠利用map進行判斷,由於註冊時將賬號和密碼綁定到了一塊兒
    若是輸入的命令是申請
        判斷是否存在該帳號
            是的話,提示錯誤
            不是的話,完成註冊,而且將帳號和密碼用map關聯起來//即QQ[order[i].user ]==order[i].password
end for

2.2.2代碼截圖


2.2.3本題PTA提交列表說明

Q1:編譯錯誤,emmmm又是沒改編譯器,多種錯誤就是我按上述的一開始的想法去作的,有答案錯誤,也有段錯誤,告辭
A1:因而改用了map去作,將QQ[order[i].user ]==order[i].password關聯到一塊兒,查找帳號是否存在,用QQ.find(order[i].user )==QQ.end() 便可,不用再構造另外一個數組存放再去一一比較,不過也要遍歷一遍就對了,在匹配密碼是否正確時,也比較簡單,用QQ[order[i].user ]!=order[i].password 判斷一下便可

2.3 題目3:航空公司VIP客戶查詢

2.3.1設計思路

定義結構體Customer
定義常量N,K,M,定義結構體變量customer,定義map容器massage
輸入N,K
for int i=0 to N do
    輸入客戶身份證號碼以及里程的長度
    若是里程小於k值
        直接讓它等於k值
    若是用戶不存在重複,就直接等於里程值
    不然進行累加
end for
輸入M
for int i=0 to M do
    輸入查詢的身份證號碼
    定義result=massage[customer[i].code];//用result代替,減小搜索次數
    若是result=0//即用戶不存在
        輸出提示錯誤信息
    不然輸出result

2.3.2代碼截圖


2.3.3本題PTA提交列表說明

Q1:一開始看題目,和上一題同樣嘛仍是用map作,很快咻咻咻就打完代碼了,而後愉快的按了提交,部分正確??有兩個測試運行超時了
A1:因而偷偷看了大佬的博客,用了一個語句ios::sync_with_stdio(false);//解除與stdio的綁定,雖然不懂,可是偷過來用用
Q2:因而有了17分,過了一個測試點,可是還有一個仍是過不了
A2:仍是乖乖的去請教大佬吧,大佬建議用hash_map試一下,由於hash_map的查找效率是O(1),可是顯然改了半天發現連編譯都不過,我仍是用map吧,開始瘋狂試探,越改分越低
A3:仍是繼續問大佬吧,顯然大佬就是大佬,他發現了我代碼裏的問題,附上以前的代碼,在這個代碼裏要查找了兩遍,第一遍查找是否存在,若是存在到了else語句裏仍是要再查找一遍。因而用一個result代替massage[customer[i].code],不存在時只要判斷是否爲0就能夠了,不用再查找一遍,輸出的話,也直接輸出result就能夠了,而後提交就答案正確了
Q3:可是問題又來了,當我打好註釋再次提交後,發現又錯了??難道我哪裏不當心改到了??我就把以前的正確代碼複製過來從新提交發現仍是錯的??發生了啥,難道對的機會是可遇不可求??改不動了,就這樣吧,起碼它對過

3.閱讀代碼

3.1 題目:查找和替換模式

3.2 解題思路

這題的解題思路是構造一個hashmap,遍歷每個字符串,將該字符串中的每個字符都和pattern中的每個字符進行一一對應,例如,第一個"abc",則遍歷以後,a對應pattern中的a;第二個"b"遍歷後對應pattern中的第而個"b";可是第三個"c"和pattern中的"b"不對應,因此該字符不能壓入list中。因此hashmap以pattern中的每一個字符爲key,以字符串中的每一個字符爲value,進行遍歷。可是這裏須要特別注意的地方是凡是pattern中不同的字符,所對應的字符串中的每個字符必須不同,哪怕對應到字符串中的字符沒有在hashmap中出現過,這須要單獨判斷

3.3 代碼截圖


3.4 學習體會

這題是力扣上的題,它是用hashmap來作,靈活的將模式串和字符串連在一塊兒,判斷模式是否同樣的話,用hashmap也能夠判斷模式裏是否有重複值,這樣,沒有重複值的就能夠很快判斷出來了
相關文章
相關標籤/搜索