目錄算法
查找是咱們平常生活中常常要用到的,搜索引擎就是一個很是好的例子,若是搜索速度不夠快,那麼當用戶模糊搜索時,可能就會面臨一個慘無人道的體驗。以前大一上用的基本上都是順序搜索,很顯然這一種搜索算法的速度已經不能知足咱們的須要了,這就有必要去深刻研究查找數據的方法,減小等待時間。也是經歷了這一個章節咱們才瞭解到樹的強大之處,不斷減少搜索區間,使得本來浩大的工程變得容易。而哈希表則以空間換取時間,使得零等待變成可能。這些都是很是強大的算法,值得爲咱們去學習和使用。函數
Description:學習
在一棵樹T中兩個結點u和v的最近公共祖先(LCA),是樹中以u和v爲其後代的深度最大的那個結點。現給定某二叉搜索樹(BST)中任意兩個結點,要求你找出它們的最近公共祖先。函數LCA須返回樹T中兩個結點u和v的最近公共祖先結點的鍵值。若u或v不在樹中,則應返回ERROR。測試
Input:大數據
2 7搜索引擎
Output:設計
LCA = 63d
對於這道題目,要抓住兩個點,一個是最近的祖先節點知足的條件,對於最近的祖先節點來講,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: 在右子樹中繼續查找
這一個錯誤是由於我忘了考慮最近祖先就是uv其中一個的狀況,只要將判斷uv是否在兩側的開區間改成閉區間就好啦blog
Description:
本題要求實現函數,判斷給定二叉樹是否二叉搜索樹。
函數IsBST須判斷給定的T是否二叉搜索樹,即知足以下定義的二叉樹:
定義:一個二叉搜索樹是一棵二叉樹,它能夠爲空。若是不爲空,它將知足如下性質:
非空左子樹的全部鍵值小於其根結點的鍵值。
非空右子樹的全部鍵值大於其根結點的鍵值。
左、右子樹都是二叉搜索樹。
若是T是二叉搜索樹,則函數返回true,不然返回false。
Input:
Output:
Yes
思路一:
第一個方法要抓住二叉搜索樹的特色,中序遍歷爲遞增序列,設立一個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)
思路一:
思路二:
關於這道題目我測試了不少遍,有幾回是預採用靜態聲明的變量忘記用static了,可是居然還過了四個點,還有就是將左子樹的代碼套用到右子樹時忘記改大小於號了
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
對身份證的校驗碼進行分組,使用map容器很容易就能夠作出來了,後面我再拿哈希試試
map<string, int> account[11] cin >> T while T--: 根據校驗碼讀入用戶信息到account cin >> T while T--: 根據輸入輸出相應內容
前面幾回錯誤都是由於最後的大數據致使超時,後面對stdio解除綁定就快起來啦
此次看選作題感受實在想不到沒什麼方便的思路,就直接來看選作題吧
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%
總體的思路就是將輸入的數據轉化成一個個的英文字母而後存入到set容器當中,比較的時候就直接對一個set進行遍歷,看是否是在另一個容器裏面也有,統計相同個數
其實沒寫出來的主要緣由仍是以前對STL不瞭解,不知道怎麼遍歷STL容器,知道了這一個其餘的就很是簡單了,對數據進行處理,存儲。STL上課的時候只是粗略講,課後仍是應該本身去多學一點的。很是有用。。