无序去重:
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)中某一元素随机交换
}
时间: 2024-11-05 13:34:55