1. 程式人生 > >牛客網查詢型別+排序的選擇題---手記1

牛客網查詢型別+排序的選擇題---手記1

0、其中希爾排序的時間複雜度為O(n^1.5)
在這裡插入圖片描述

歸併排序的常規實現方法是O(n)輔助空間。優化過的演算法可以只使用O(1)的空間。利用的是反轉偏移的技巧。
在這裡插入圖片描述
0.1 二叉樹的性質
二叉樹有以下幾個性質:TODO(上標和下標)
性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。
性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)。
性質3:包含n個結點的二叉樹的高度至少為log2 (n+1)。
性質4:在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1。

1、深度為k的二叉樹最多有2的k次方-1個結點,深度為7的二叉樹有127個結點,深度為8的二叉樹有255個結點,所以154個結點的二叉樹有8層。
2、當採用分塊查詢時,資料的組織方式為:資料分成若干塊,每塊內資料不必有序,但塊間必須有序,每塊內最大(或最小)的資料組成索引塊
3、在索引順序表中,實現分塊查詢,在等概率查詢情況下,其平均查詢長度不僅與表中元素個數有關,而且與每塊中元素個數有關。
4、二分/折半查詢
程式碼實現

public static int biSearch(int arr[], int target) {
        int low = 0, high = arr.length - 1;
        int mid;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (arr[mid] == target)
                return mid;
            else if (arr[mid] < target)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return -1;
    }

效能分析

時間複雜度:

因為二分查詢每次排除掉一半的不適合值,所以對於n個元素的情況:

一次二分剩下:n/2 
兩次二分剩下:n/2/2 = n/4 
……. 
m次二分剩下:n/(2^m)
在最壞情況下是在排除到只剩下最後一個值之後得到結果,即
n/(2^m)=1

所以由上式可得 : 2^m=n
進而可求出時間複雜度為: log2(n)
5、分塊/索引查詢:假設索引表有n個元素,每塊含有s個元素,平均查詢長度為:ASL=(n/s+s)/2 +1,時間複雜度為O(n)~O(log2n)
6、三種靜態查詢演算法:順序、二分/折半、索引/分塊查詢
7、Floyd
8、適於對動態查詢表進行高效率查詢的組織結構是分塊有序表(錯)
如果線性表既要快速查詢又要經常動態變化,則可採用分塊查詢。
而這裡說的是動態查詢表!!!動態查詢表是在查詢的同時允許對錶做修改操作(插入或者刪除)的表 。
靜態查詢表:

只進行以下2個操作:
1.查詢某個“特定”資料元素是否在查詢表中
2.查詢某個“特定”資料元素的各種屬性
有序表、分塊有序表、線性連結串列都是靜態查詢表
效能分析:平均查詢長度:(當查詢關鍵字等概率時)ASL = 1/(n+1)
動態查詢表: 表結構是在查詢過程中動態生成的,通俗解釋,對於給定key,若表中存在某關鍵字與key相等則查詢成功返回,若未找到則插入關鍵字等於key的記錄。
二叉排序樹、平衡二叉樹、B樹、B+樹都是動態查詢。(對查詢表進行插入和刪除操作—即為動態的)
9、選擇排序是每輪選一個最小值出來, 所以32輪就有32個排好了
10、 使用二分搜尋演算法在 1000 個有序元素表中搜索一個特定元素,在最壞情況下,搜尋總共需要比較的次數為( )。
二分搜尋的時間複雜度是
O(log2 n)取下線然後再加1
11、用二分法查詢長度為10的、排好序的線性表,查詢不成功時,最多需要比較多少次?
二分查詢,可以用二叉判定樹,查詢不成功的次數不超過判定樹的深度,即(log2n)+1,其中log2n向下取整
12、具有12個關鍵字的有序表,折半查詢的平均查詢長度()

將12個數畫成完全二叉樹,第一層有1個、第二次2個、第三層4個,第四層只有5個。
二分查詢時:
第一層需要比較1次
第二兩個數,每個比較2次
第三層四個數,每個比較3次
第四層五個數,每個比較4次
則平均查詢長度即為:(1+22+34+4*5)/12 = 37/12 = 3.0833 即為 A、3.1
13、使用KMP演算法在文字串S中找模式串P是一種常見的方法。假設S=P={xyxyyxxyx},亦即將S對自己進行匹配,匹配過程中正確的next陣列是____。
0,1,1,2,3,1,2,2,3
x y x y y x x y x
0 0 1 2 0 1 1 2 3 首位-1,別的位後移一位
-1 0 0 1 2 0 1 1 2 +1
0 1 1 2 3 1 2 2 3
14、在KMP演算法中,已知模式串為ADABCADADA,請寫出模式串的next陣列值?
0,1,1,2,1,1,2,3,4,3
A D A B C A D A D A
0 0 1 0 0 1 2 3 2 3 首位-1,別的位後移一位
-1 0 0 1 0 0 1 2 3 2 +1
0 1 1 2 1 1 2 3 4 3
15、拓撲排序可以判斷出一個有向圖是否有環(迴路)
16、關於紅黑樹和AVL樹,以下哪種說法正確?abcd
a 兩者都屬於自平衡二叉樹;
b 兩者查詢,插入,刪除的時間複雜度相同; O(log2 n)
c 包含n個內部節點的紅黑樹的高度是O(log(n));
d JDK的TreeMap是一個紅黑樹的實現

關於紅黑樹和AVL樹,來自網路:

1 紅黑樹的 好處 及 用途

紅黑樹 並不追求“完全平衡 ”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了效能。

紅黑樹能夠以 O(log2 n) 的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高。

當然,紅黑樹並不適應所有應用樹的領域。如果資料基本上是靜態的,那麼讓他們待在他們能夠插入,並且不影響平衡的地方會具有更好的效能。如果資料完全是靜態的,例如,做一個雜湊表,效能可能會更好一些。

在實際的系統中,例如,需要使用動態規則的防火牆系統,使用紅黑樹而不是散列表被實踐證明具有更好的伸縮性。

典型的用途是實現關聯陣列

2 AVL樹是最先發明的自平衡二叉查 找樹。在AVL樹中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。AVL樹得名於它的發明者 G.M. Adelson-Velsky 和 E.M. Landis,他們在 1962 年的論文 “An algorithm for the organization of information” 中發表了它。

引入二叉樹的目的是為了提高二叉樹的搜尋的效率,減少樹的平均搜尋長度.為此,就必須每向二叉樹插入一個結點時調整樹的結構,使得二叉樹搜尋保持平衡,從而可能降低樹的高度,減少的平均樹的搜尋長度.

AVL樹的定義:
一棵AVL樹滿足以下的條件:
1>它的左子樹和右子樹都是AVL樹
2>左子樹和右子樹的高度差不能超過1
從條件1可能看出是個遞迴定義,如GNU一樣.

性質:
1>一棵n個結點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1)
2>一棵n個結點的AVL樹的平均搜尋長度保持在0(log2(n)).
3>一棵n個結點的AVL樹刪除一個結點做平衡化旋轉所需要的時間為0(log2(n)).

從1這點來看 紅黑樹是犧牲了嚴格的高度平衡的優越條件 為 代價紅黑樹能夠以O(log2 n)的時間複雜度進行搜尋、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的資料結構 能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的演算法時間複雜度和AVL相同,但統計效能比AVL樹更高.

17、快希選堆 不穩定演算法
假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的否則稱為不穩定的
堆排序、快速排序、希爾排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。
18、已知資料表A中每個元素距其最終位置不遠,為節省時間排序,應採用什麼方法排序?插入排序
19、任何一個基於"比較"的內部排序的演算法,若對6個元素進行排序,則在最壞情況下所需的比較次數至少為?
因為6個數字的排列組合是6!,
按照決策樹每次可以判斷一半的情況,2^k
要求2^k > 6!
取log後得到 k > log(6!) = log(720)
log(2^9) = log(512) = 9 < log(720) < log(2^10) = log(1024) = 10,
所以應該至少選10次。
20、在有序列表中通過二分查詢的複雜度一定是O(log2n)
21、排序二叉樹元素查詢的複雜度可能為O(n)
22、既希望較快的查詢又便於線性表動態變化的查詢方法是 ( )
索引順序查詢又稱為分塊查詢,效率在順序查詢和折半查詢之間
23、列舉排序,通常也被叫做秩排序,演算法基本思想是:對每一個要排序的元素,統計小於它的所有元素的個數,從而得到該元素在整個序列中的位置,時間複雜度為O(n^2) 。
24、無向圖G=(V E),其中V={a,b,c,d,e,f},E={<a,b>,<a,e>,<a,c>,<b,e>,<c,f>,<f,d>,<e,d>}對該圖進行深度優先排序,得到的頂點序列正確的是() D
A. a,b,e,c,d,f
B. a,c,f,e,b,d
C. a,e,b,c,f,d
D. a,e,d,f,c,b
解析:
A. a, b, e, c, d, f
a->b, 沒問題;到b後,b的鄰接點中只剩下e未被訪問,b->e沒問題
e->c,不行,e此時仍有未被訪問的鄰接點d, 且e沒有跟c連通,答案錯誤

B. a, c, f, e, b, d
a->c->f, 沒問題;f->e,不行,f此時仍有未被訪問的鄰接點d,且f沒有跟e連通,答案錯誤

C. a, e, b, c, f, d
a->e->b,沒問題;到b後,b的鄰接點均被訪問,應回溯到e,然後訪問e其他未被訪問的鄰接點(只剩d),且b沒有跟c連通,答案錯誤

D. a, e, d, f, c, b
a->e->d->f->c,沒問題;到c後,其兩個鄰接點a與f均已被訪問,按c->f->d->e->a回溯時候發現,e頂點仍有未被訪問的頂點b,於是a->e->d->f->c->b
25、