1. 程式人生 > 實用技巧 >【轉】/sys/kernel/debug/usb/devices解析

【轉】/sys/kernel/debug/usb/devices解析

錯題集

順序表

  • 線性表的順序儲存是一種()。
    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;
}