【轉】/sys/kernel/debug/usb/devices解析
阿新 • • 發佈:2021-01-21
錯題集
順序表
- 線性表的順序儲存是一種()。
A. 隨機存取的儲存結構
B. 順序存取的儲存結構
C. 索引存取的儲存結構
D. 雜湊存取的儲存結構
【答案】: A
【解釋】:存取方式指的是讀寫方式。順序表是一種支援隨機存取的儲存結構,根據起始地址加上元素的序號,可以很方便地訪問任意一個元素,這就是隨機存取的概念。
【知識補充】:
- Q:從順序表中刪除具有最小值的元素(假設唯一)並由函式返回被刪除元素的值。空出的位置由最後一個元素填補,若順序表為空則顯示出錯資訊並退出執行。
A:
解答:
演算法思想:搜尋整個順序表,查詢最小元素並記住其位置,搜尋結束後用最後一個元素填補空出的原最小值元素的位置。
程式碼:
bool Del_Min(sqList &L,ElemType & value){ //刪除順序表L中最小元素結點,並通過引用型引數返回其值 //若刪除成功,則返回true,否則,返回false if(L.length==0) return false; value =L.data[0]; int idx=0; for(int i=1;i<L.length;i++){ if(L.data[i]<value){ value = L.data[i];// value記錄當前最小元素 idx = i; } } L.data[i] = L.data[L.length-1];//空出的位置由最後的元素填補 L.length--; return true; }
*Q:設計一個高效演算法,將順序表L的所有元素逆置,要求演算法的空間複雜度為O(1).
*A:
演算法思想: 掃描順序表的前半部分元素,將其與後半部分對應元素交換。
程式碼:
void Reverse(sqList &L){ Elemtype tmp;//輔助變數 for(int i=0;i<L.length/2;i++){ tmp = L.data[i]; L.data[i] = L.data[L.length-i-1]; L.data[L.length-i-1] = tmp; } }
*Q:對長度為n的順序表L,編寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法刪除線性表中所有值為x的資料元素。
A:
*解法一:用k記錄順序表L中不等於x的元素的個數,邊掃描L邊統計k,並將不等於x的元素向前移動k個位置,最後修改L的長度。
void delete_x(sqList &L,Elemtype x){
//本演算法實現刪除順序表L中所有值為x的資料元素
int k = 0;//記錄值不等於x的元素個數
for(int i = 0; i < L.length; i++){
if(L.data[i] != x){
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
}
*解法二:用k記錄順序表L中等於x的元素個數,邊掃描L邊統計k,並將不等於x的元素前移k個位置,最後修改順序表L的長度。
void delete_x(sqList &L,Elemtype x){
int k = 0;//k值記錄值等於x的元素個數
while(i < L.length){
if(L.data[i] == x){
k++;
}
else
L.data[i-k] = L.data[i];//當前元素前移k個位置
i++;
}
L.length = L.length - k;//順序表長度遞減
}
解法3:設頭尾指標分別從順序表頭尾遍歷,如果頭指標遍歷到元素值等於x,那麼將尾指標對應元素值放到頭指標位置,直到頭尾指標相遇。
這種做法可能會導致原順序表中的位置關係發生變化。
void delete_x(sqList &L,Elemtype x){
int i=0;//定義頭指標從頭遍歷順序表
int j = L.length-1;//定義尾指標從後遍歷順序表
while(i<j){
if(L.data[i]==x){
while(L.data[j] == x && i < j)
j--;//j從後向前找到第一個不等於x的元素
if(i>=j) break;//如果頭尾指標相遇則停止!
L.data[i] = L.data[j];
j--;
}
else
i++;//頭指標向後遍歷
}
L.length = i+1;
}