无序向量的各种处理

1 顺序查找

template <typename T>  rank vector <T> ::find(T const &e ,rank lo,rank hi){

while((lo<hi--)&&(e!=_elem[hi]));

return hi;

}

最坏情况下的时间复杂度为O(n),最好情况下为O(1).

对于规模相同,内部组成不同的输入,渐进运行时间却有本质的区别,故此类算法也称作输入敏感的算法。

 

2 插入

template<typename T> rank vector<T> :: insert(rank r,T const &e){

expend();

for(rank i=_size;i>r;i--)  _elem[i]=_elem[i-1];

_elem[r]=e;  _size++;

return r;

}

 

3 删除

区间删除

template<typename T> rank vector<T> :: remove(rank lo,rank hi){

if(lo==hi) return 0;

while (hi<_size)  _elem[lo++]=_elem[hi++];  // [hi,_size)顺次前移hi-lo个单元

_size=lo;

shrink();  //若有必要,则缩容

return hi-lo;}

单元数删除

template<typename T> T vector<T> ::remove1(rank r){

T e=_elem[r];

remove(r,r+1);

return e;}

最坏情况下的时间复杂度为O(n),最好情况下为O(1).

 

4 唯一化

template<typename T> int vector<T> ::deduplicate(){

int oldsize=_size;

rank i=1;

while(i<_size)

(find(_elem[i],0,i)<0)  ?  i++:remove(i);

return oldsize-_size;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值