DS博客做業07--查找

1.本週學習總結

1.1思惟導圖

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

查找是咱們平常生活中常常要用到的,搜索引擎就是一個很是好的例子,若是搜索速度不夠快,那麼當用戶模糊搜索時,可能就會面臨一個慘無人道的體驗。以前大一上用的基本上都是順序搜索,很顯然這一種搜索算法的速度已經不能知足咱們的須要了,這就有必要去深刻研究查找數據的方法,減小等待時間。也是經歷了這一個章節咱們才瞭解到樹的強大之處,不斷減少搜索區間,使得本來浩大的工程變得容易。而哈希表則以空間換取時間,使得零等待變成可能。這些都是很是強大的算法,值得爲咱們去學習和使用。函數

2.PTA實驗做業

2.1.題目1:6-3 二叉搜索樹中的最近公共祖先

Description:學習

在一棵樹T中兩個結點u和v的最近公共祖先(LCA),是樹中以u和v爲其後代的深度最大的那個結點。現給定某二叉搜索樹(BST)中任意兩個結點,要求你找出它們的最近公共祖先。函數LCA須返回樹T中兩個結點u和v的最近公共祖先結點的鍵值。若u或v不在樹中,則應返回ERROR。測試

Input:大數據


2 7搜索引擎

Output:設計

LCA = 63d

2.1.1設計思路

對於這道題目,要抓住兩個點,一個是最近的祖先節點知足的條件,對於最近的祖先節點來講,u和v一定在這個節點的兩側。還有一個要注意的是u和v必須存在於這個查找樹裏面,這個過程能夠只作一次,所以咱們能夠利用static的特性,讓某一代碼片斷在函數中只執行一次。這個代碼片斷就是咱們確認uv存在的代碼。而後就是對樹的遍歷,若是uv都小於當前節點,說明咱們要找的祖先節點在左樹,反之在右樹。code

static int flag = 0
if flag == 0:
    在T中查找u,v
    if 不存在:
        返回ERROR

flag=1
int Max=max(u,v)
int Min=min(u,v)
if Min < T->data < max:
    找到了
else if Min,Max < T->data:
    在左子樹中繼續查找
else if Min,Max > T->data:
    在右子樹中繼續查找

2.1.2代碼截圖

2.1.3本題PTA提交列表說明


這一個錯誤是由於我忘了考慮最近祖先就是uv其中一個的狀況,只要將判斷uv是否在兩側的開區間改成閉區間就好啦blog

2.2.題目2:6-2 是否二叉搜索樹

Description:

本題要求實現函數,判斷給定二叉樹是否二叉搜索樹。
函數IsBST須判斷給定的T是否二叉搜索樹,即知足以下定義的二叉樹:
定義:一個二叉搜索樹是一棵二叉樹,它能夠爲空。若是不爲空,它將知足如下性質:
非空左子樹的全部鍵值小於其根結點的鍵值。
非空右子樹的全部鍵值大於其根結點的鍵值。
左、右子樹都是二叉搜索樹。
若是T是二叉搜索樹,則函數返回true,不然返回false。

Input:

Output:

Yes

2.2.1設計思路

思路一:
第一個方法要抓住二叉搜索樹的特色,中序遍歷爲遞增序列,設立一個static變量記錄上一個節點,畢竟是函數題。而後在中間的時候判斷一下是否大於上一個節點。這樣就能夠達到判斷二叉搜索樹的目的了

//中序遍歷其實也不用貼僞代碼了,你們都明白,代碼過於簡單致使僞代碼都像是複製過來的同樣
static int last = -111111
IsBST(T->left)
if last < T->data: last = T->data
else: return false
IsBST(T->left)

思路二:
第二種思路較爲遜色,一樣抓住二叉搜索樹的特色,左子樹的最大值小於根節點,右子樹的最小值大於根節點,這樣子將每個節點都判斷一遍就能知道對不對了,這種方法的時間複雜度較高,由於同一個節點可能要訪問屢次,而第一種方法每一個節點只要訪問一次就行了

if 左子樹存在:
    left=左子樹最大
    if left > T->data: 返回false
if 右子樹存在:
    right=右子樹最小
    if right < T->fata: 返回false
return IsBST(T->left)&&IsBST(T->right)

2.2.2代碼截圖

思路一:

思路二:

2.2.3本題PTA提交列表說明


關於這道題目我測試了不少遍,有幾回是預採用靜態聲明的變量忘記用static了,可是居然還過了四個點,還有就是將左子樹的代碼套用到右子樹時忘記改大小於號了

2.3.題目3:7-2 航空公司VIP客戶查詢

Description:

很多航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到必定數量後,可使用里程積分直接兌換獎勵機票或獎勵升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。輸入首先給出兩個正整數N和K。其中K是最低里程,即爲照顧乘坐短程航班的會員,航空公司還會將航程低於K千米的航班也按K千米累積。隨後N行,每行給出一條飛行記錄。飛行記錄的輸入格式爲:18位身份證號碼(空格)飛行里程。其中身份證號碼由17位數字加最後一位校驗碼組成,校驗碼的取值範圍爲0~9和x共11個符號;飛行里程單位爲千米,是(0, 15 000]區間內的整數。而後給出一個正整數M,隨後給出M行查詢人的身份證號碼。

Input:

4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x

Output:

800
15000
1000
No Info

2.3.1設計思路

對身份證的校驗碼進行分組,使用map容器很容易就能夠作出來了,後面我再拿哈希試試

map<string, int> account[11]
cin >> T
while T--:
    根據校驗碼讀入用戶信息到account
cin >> T
while T--:
    根據輸入輸出相應內容

2.3.2代碼截圖

2.3.3本題PTA提交列表說明


前面幾回錯誤都是由於最後的大數據致使超時,後面對stdio解除綁定就快起來啦

3.閱讀代碼

3.1 題目

此次看選作題感受實在想不到沒什麼方便的思路,就直接來看選作題吧

Description:

實現一種簡單原始的文件類似度計算,即以兩文件的公共詞彙佔總詞彙的比例來定義類似度。爲簡化問題,這裏不考慮中文(由於分詞太難了),只考慮長度不小於三、且不超過10的英文單詞,長度超過10的只考慮前10個字母。

Input:

3
Aaa Bbb Ccc
#
Bbb Ccc Ddd
#
Aaa2 ccc Eee
is at Ddd@Fff
#
2
1 2
1 3

Output:

50.0%
33.3%

3.2 解題思路

總體的思路就是將輸入的數據轉化成一個個的英文字母而後存入到set容器當中,比較的時候就直接對一個set進行遍歷,看是否是在另一個容器裏面也有,統計相同個數

3.3 代碼截圖


3.4 學習體會

其實沒寫出來的主要緣由仍是以前對STL不瞭解,不知道怎麼遍歷STL容器,知道了這一個其餘的就很是簡單了,對數據進行處理,存儲。STL上課的時候只是粗略講,課後仍是應該本身去多學一點的。很是有用。。

相關文章
相關標籤/搜索