二分查詢實現----面試總結
今天面試面試官提了一個問題:兩萬個整數、整數有序、平時不會怎麼修改,如何使空間最小查詢最快。
其實論查詢速度當然是常數級別的雜湊演算法最快了,最簡單的雜湊就是以陣列下標做鍵,對應陣列元素做值。但是雜湊可能需要解決衝突,而衝突會帶來空間的開銷。所以在此提出以陣列儲存、二分查詢查詢的辦法。二分查詢的複雜度是log(n)。
好久沒寫了,當面竟然沒寫對,慚愧,回來再好好複習一下。有時候大概懂和能寫出來還是有一定距離的。
2、問題是:一個程式有多個執行緒如何能夠知道是哪個執行緒出現了死迴圈。一種是運用工具minidown,另外是利用一個守護程式跟蹤執行緒PC是否一直在某個小範圍內移動(其實我不知道怎麼實現,以後再想)。
3、#include<stdio.h>
#define TOTAL (sizeof(array) / sizeof(array[0]))#define TOTAL_ELEMENTS 7
int array[] = {23,34,12,17,204,99,16};
for(int d=-1;d <= TOTAL_ELEMENTS-2;d++)
這個d會退化為0xfffffff,但是在C++的編譯器下這種情況不會發生。
4、如果一個伺服器過了兩三天突然崩潰了,會是什麼原因:
C/C++程式還可能產生另一個指標問題:丟失對已分配記憶體的引用。當記憶體是在子程式中被分 配時,通常會出現這種問題,其結果是程式從子程 序中返回時不會釋放記憶體。如此一來,對已分配的記憶體的引用就會丟失,只要作業系統還在執行中,則程式就會一 直使用該記憶體。這樣的結果 是,曾佔用更多的記憶體的程式會降低系統效能,直到機器完全停止工作,才會完全清空記憶體。
第二,C指標錯誤
用C或C++編寫的程式,如Web伺服器API模組,有可能導致系統的崩潰,因為只要間接引 用指標(即,訪問指向的記憶體)中出現一個錯誤,就會 導致作業系統終止所有程式。另外,使用了糟糕的C指標的Java模擬量(analog)將訪問一個空的 物件引用。Java中的空引用通常不會導致立刻 退出JVM,但是前提是程式設計師能夠使用異常處理方法恰當地處理錯誤。在這方面,Java無需過多的關注,但 使用Java對可靠性進行額外的度量 則會對效能產生一些負面影響。
第三,資料庫中的臨時表不夠用
許多資料庫的臨時表(cursor)數目都是固定的,臨時表即保留查詢結果的記憶體區域。在臨時表中的資料都被讀取後,臨時表便會被釋放,但大量 同時進行的查詢可能耗盡數目固定的所有臨時表。這時,其他的查詢就需要列隊等候,直到有臨時表被釋放時才能再繼續執行。
第四,執行緒死鎖
由多執行緒帶來的效能改善是以可靠性為代價的,主要是因為這樣有可能產生執行緒死鎖。執行緒死鎖 時,第一個執行緒等待第二個執行緒釋放資源,而 同時第二個執行緒又在等待第一個執行緒釋放資源。我們來想像這樣一種情形:在人行道上兩個人迎面相遇,為了給對方讓 道,兩人同時向一側邁出 一步,雙方無法通過,又同時向另一側邁出一步,這樣還是無法通過。雙方都以同樣的邁步方式堵住了對方的去路。假設這種情況一直持續 下 去,這樣就不難理解為何會發生死鎖現象了。
第五,磁碟已滿
導致系統無法正常執行的最可能的原因是磁碟已滿。一個好的網路管理員會密切關注磁碟的使用情況,隔一定的時間,就需要將磁碟上的一些負 載轉存到備份儲存介質中(例如磁帶)。日誌檔案會很快用光所有的磁碟空間。Web伺服器的日誌檔案、SQL*Net的日誌檔案、 JDBC日誌檔案, 以及應用程式伺服器日誌檔案均與記憶體洩漏有同等的危害。可以採取措施將日誌檔案儲存在與作業系統不同的檔案系統中。日誌檔案系統空間已 滿時Web伺服器也會被掛起,但機器自身被掛起的機率已大大減低。
第六,伺服器超載
Netscape Web伺服器的每個連線都使用一個執行緒。Netscape Enterprise Web伺服器會線上程用完後掛起,而不為已存在的連線提供任何服 務。如果有一種負載分佈機制可以檢測到伺服器沒有響應,則該伺服器上的負載就可以分佈到其 它的Web伺服器上,這可能會致使這些伺服器 一個接一個地用光所有的執行緒。這樣一來,整個伺服器組都會被掛起。作業系統級別可能還在不斷地接收新的連線, 而應用程式(Web伺服器) 卻無法為這些連線提供服務。使用者可以在瀏覽器狀態行上看到connected(已連線)的提示訊息,但這以後什麼也不會發生。
總之,還有許多因素也極有可能導致Web香港伺服器租用或香港伺服器託管站點無法工作。有許多種原因可能導致Web站點無法正常工作,這 使得系統地檢查所有問題變得很困難。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
int BinSearch(SeqList *R, int n,KeyType K) { //在有序表R[0..n-1]中進行二分查詢,成功時返回結點的位置,失敗時返回-1 int low=0,high=n-1,mid; //置當前查詢區間上、下界的初值 while (low<=high) { if (R[low].key==K) return low; if (R[high].key==k) return high; //當前查詢區間R[low..high]非空 mid=low+((high-low)/2); /*使用(low+high)/2會有整數溢位的問題 (問題會出現在當low+high的結果大於表示式結果型別所能表示的最大值時, 這樣,產生溢位後再/2是不會產生正確結果的,而low+((high-low)/2) 不存在這個問題*/ if (R[mid].key==K) return mid; //查詢成功返回 if (R[mid].key<K) low=mid+1; //繼續在R[mid+1..high]中查詢 else high=mid-1; //繼續在R[low..mid-1]中查詢 } if (low>high) return -1; //當low>high時表示所查詢區間內沒有結果,查詢失敗 } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int bsearchWithoutRecursion( int array[], int low, int high, int target) { while (low<=high) { int mid=(low+high)/2; if (array[mid]>target) high=mid-1; else if (array[mid]<target) low=mid+1; else return mid; } return -1; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int binSearch( const int *Array, int start, int end, int key) { int left,right; int mid; left=start; right=end; while (left<=right) { mid=(left+right)/2; if (key==Array[mid]) return mid; else if (key<Array[mid]) right=mid-1; else if (key>Array[mid]) left=mid+1; } return -1; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int a[100]={1,2,3,5,12,12,12,15,29,55}; //陣列中的數(由小到大) int k; //要找的數字 int found( int x, int y) { int m=x+(y-x)/2; if (x>y) //查詢完畢沒有找到答案,返回-1 return -1; else { if (a[m]==k) return m; //找到!返回位置. else if (a[m]>k) return found(x,m-1); //找左邊 else return found(m+1,y); //找右邊 } } int main() { cin>>k; //輸入要找的數字c語言把cin換為scanf即可 cout<<found(0,9); //從陣列a[0]到a[9]c語言把cout換為printf即可 return 0; } |
相關文章
- 基礎二分查詢總結
- PHP 實現二分查詢PHP
- 查詢演算法集:順序查詢、二分查詢、插值查詢、動態查詢(陣列實現、連結串列實現)演算法陣列
- Js實現二分查詢,加油JS
- Golang實現二分查詢法Golang
- 二分查詢(函式實現)函式
- 減治思想——二分查詢詳細總結
- 二分查詢實現符號表符號
- 【總結】二分查詢 —— 一種減而治之的查詢方法(1)
- 【資料結構】折半查詢(二分查詢)資料結構
- Java實現二分查詢演算法Java演算法
- 查詢——二分查詢
- 資料結構與演算法整理總結---二分查詢資料結構演算法
- 二分法查詢(遞迴實現)遞迴
- java實現的二分法查詢Java
- SQL總結(七)查詢實戰SQL
- 轉:C++實現的變種二分查詢法(折半查詢)--二叉查詢樹C++
- 二分查詢(一)——純粹的二分查詢
- Python查詢-二分查詢Python
- MongoDB查詢總結MongoDB
- SQL查詢總結SQL
- 【軟體實施面試】MySQL和Oracle聯合查詢以及聚合函式面試總結面試MySqlOracle函式
- 二分查詢
- 用兩個二分查詢實現的海倫信封程式
- 查詢演算法__二分查詢演算法
- 順序查詢和二分查詢
- 面試題總結:HashMap實現原理面試題HashMap
- PHP二分查詢PHP
- 二分查詢法
- 二分查詢的兩種實現形式遞迴和迭代遞迴
- 查詢演算法之二分查詢演算法
- 二分查詢 | 二分查詢的一種推薦寫法
- 微策略面試題:在旋轉後的陣列中查詢元素(二分查詢)面試題陣列
- Android 面試常見 - 二分查詢演算法題Android面試演算法
- python查詢演算法的實現-二分法Python演算法
- 提高查詢速度方法總結
- SQL總結(一)基本查詢SQL
- SQL總結(三)其他查詢SQL