Vector::去重、置亂

無序去重:

template <typename T> int Vector<T>::deduplicate() { //刪除無序向量中重複元素(高效版)
   int oldSize = _size; //記錄原規模
   Rank i = 1; //從_elem[1]開始
   while (i < _size) //自前向後逐一考查各元素_elem[i]
      (find(_elem[i], 0, i) < 0) ? //在其前綴中尋找與之雷同者(至多一個)
         i++ : remove(i); //若無雷同則繼續考查其後繼,否則刪除雷同者
   return oldSize - _size; //向量規模變化量,即被刪除元素總數
}

有序去重:

template <typename T> int Vector<T>::uniquify() { //有序向量重複元素剔除算法(高效版)
   Rank i = 0, j = 0; //各對互異“相鄰”元素的秩
   while (++j < _size) //逐一掃描,直至末元素
      if (_elem[i] != _elem[j]) //跳過雷同者
         _elem[++i] = _elem[j]; //發現不同元素時,向前移至緊鄰於前者右側
   _size = ++i; shrink(); //直接截除尾部多餘元素
   return j - i; //向量規模變化量,即被刪除元素總數
}

區間置亂:

template <typename T> void Vector<T>::unsort(Rank lo, Rank hi) { //等概率隨機置亂向量區間[lo, hi)
   T* V = _elem + lo; //將子向量_elem[lo, hi)視作另一向量V[0, hi - lo)
   for (Rank i = hi - lo; i > 0; i--) //自後向前
      swap(V[i - 1], V[rand() % i]); //將V[i - 1]與V[0, i)中某一元素隨機交換
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章