1. 程式人生 > >05-查找

05-查找

鍵值 HR 作業 函數 根節點 利用 完成 ear 否則

1.學習總結

1.1查找的思維導圖

技術分享圖片

1.2 查找學習體會

查找內容很多,像平均查找長度,平均二叉樹插入刪除時的調整,還有B樹,哈希表,哈希沖突等重要內容,查找的內容也與我們平時生活聯系很深。
本周還學習了Map,STL的一個容器,它提供一對一的hash,很多功能直接調用函數,很方便

  • 變量聲明:map
  • map的所有節點元素都是pair,pair有兩個成員變量first,second ,第一個first是鍵值key,第二個second是實值value
  • 插入元素:
    (1)用insert函數插入pair:mapStudent.insert(pair
  • 查找:出現時,它返回資料所在位置,如果沒有,返回iter與end函數返回相同
    iter = mapStudent.find("r123");
    if(iter != mapStudent.end())
    cout<<"Find, the value is"<
  • set使用方法:
    begin()返回set容器的第一個元素
    end() 返回set容器的最後一個元素
    clear() 刪除set容器中的所有的元素
    empty() 判斷set容器是否為空
    max_size()返回set容器可能包含的元素最大個數
    size()返回當前set容器中的元素個數
    rbegin返回的值和end()相同
    rend()返回的值和rbegin()相同
  • 判斷鍵值是否存在:
    count() 用來查找set中某個某個鍵值出現的次數因為一個鍵值在set只可能出現0或1次,這樣就變成了判斷某一鍵值是否在set出現過了

2.PTA實驗作業

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

2.2 設計思路

建樹
如果為空樹則為二叉搜索樹
如果無左右孩子也為二叉搜索樹
如果左孩子不為空
   利用循環找到左子樹最右節點
        如果該節點的值大於根節點的值,則不滿足非空左子樹的所有鍵值小於其根結點的鍵值,不是二叉搜索樹
如果右孩子不為空
   利用循環找到左子樹最左節點
        如果該節點的值小於根節點的值,則不滿足非空右子樹的所有鍵值大於其根結點的鍵值,不是二叉搜索樹   
利用遞歸繼續判斷其他節點

2.3 代碼截圖

技術分享圖片

2.4 PTA提交列表說明

技術分享圖片

  • 編譯錯誤
    bool返回類型應該是true或者false,但是判斷是否為空時,我返回了NULL
  • 段錯誤
    技術分享圖片
    調試時發現卡在BinTree P=T處,是不是再進入這條語句時,又創建了一次BinTree P,類似於程序中出現倆個同名定義變量,於是把BinTree P這一句挪到了if語句外,但是結果與測試案例不符。所以按照題目中的一條條要求又重寫了一次

2.1 題目2:QQ帳戶的申請與登陸

2.2 設計思路

輸入指令行數
輸出指令
如果命令符為“L”
       如果找不到該賬號,輸出ERROR: Not Exist
       如果存在該賬號
              判斷賬戶密碼,如果正確,輸出Login: OK,否則,輸出ERROR: Wrong PW
如果命令符為“N”     
        如果找不到該賬號,插入該新賬號,輸出New: OK
        如果找到該賬號,輸出ERROR: Exist         

2.3 代碼截圖

技術分享圖片

2.4 PTA提交列表說明

技術分享圖片
格式錯誤(這個沒什麽好說明的。。。)

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

2.2 設計思路

輸入飛行記錄行數N,最低裏程K
循環輸入N行飛行記錄
       判斷已有記錄中是否有當前身份證號碼
              如果沒有,給裏程值賦初值0
        如果該記錄裏程值小於K大於0,裏程值在原先基礎上累加K
         如果大於K,累加該記錄裏程值
循環結束     
輸入整數M
循環輸入M行查詢人的身份證號碼
       如果記錄中沒有該查詢人,輸出No Info
       如果記錄中有該查詢人,輸出其當前的裏程累積值
循環結束

2.3 代碼截圖

技術分享圖片

2.4 PTA提交列表說明

技術分享圖片
技術分享圖片

運行超時,一開始理解成不能滿足大數據,是類型定義錯誤,但是改完還是錯的。。。嘗試了很久,實在找不出來問題,詢問了炳輝大佬,他說把c++的輸出輸出換成c的。百度下得到的是“輸入數字沒有問題,如果輸入非整形的話,cin流的狀態會被破壞,無法繼續輸入,可以用cin.clear清一下流的狀態,或者把輸入的部分放入while循環,輸入錯誤時退出”所以改用scanf,printf反而方便一點

3.截圖本周題目集的PTA最後排名

3.1 PTA排名

技術分享圖片

3.2 我的總分:2.5

4. 閱讀代碼

代碼鏈接:https://blog.csdn.net/chenhanzhun/article/details/39529425
代碼鏈接:https://blog.csdn.net/mdl13412/article/details/6655581
這倆篇博客的註釋都很詳細,頭文件裏的東西很復雜,但是調用map.h後續功能的實現都很方便,像本章學習的查找,如果用樹來實現,建樹,再遍歷查找,代碼量很大,但是調用Map的話,利用insert()和find(),幾句代碼就可以實現了,具體操作不需要我們來完成,知道原理就可以了,比如find()函數,如果找到它會返回一個叠代器指向鍵值為key的元素,如果沒找到就返回指向map尾部的叠代器

5. 代碼Git提交記錄截圖

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

05-查找