Vector::去重、置乱

38 篇文章 1 订阅
22 篇文章 0 订阅

无序去重:

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)中某一元素随机交换
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值