离散化(一般写法uniqueunique+vector)
-
将数据重新洗牌,并赋予数据新的位置下标。
-
好处:
有效的离散化能减小算法的时间和空间开销,提高系统对样本的分类聚类能力和抗噪声能力。
-
题外:廖神讲的太好,怕日后遗忘,故做篇笔记,来整理一下离散化,加深印象。
代码一(类双指针)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int main()
{
int n,a[N],cnt=1;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//方便去重
for(int i=1;i<n;i++)
{
if(a[i]!=a[i-1])//这里是为了完成去重,如果不同的话,就对原数组进行覆盖
a[cnt++]=a[i];//覆盖,注意a[1]没有必要进行覆盖,因为a[1]本来就是最小的,本来就是符合要求的,所以cnt从1开始,而不用从0开始
}
for(int i=0;i<cnt;i++)
cout<<a[i]<<" ";
return 0;
}
代码二(unique
)
- 顾名思义,独一无二
unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序
unique()
并非是能够直接对这个数组去重,而只是对范围内连续相同元素做去重处理,而不是起到整体去重。unique()
会将重复的元素扔到去重好后的数组后面,并返回第一个排好后第一个废弃元素的地址,并且通过与数组首地址的相减,我们可以得到新的数组长度。- 比如用unique去处理
aabbaabb
得到是abab
,而不是ab
。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={1,1,2,3,4,5,7,7,10,6};
sort(a,a+10);
int t = unique(a,a+10)-a;//unique返回的是第一个废弃
for(int i=0;i<t;i++)
cout<<"a["<<i<<"] = "<<a[i]<<endl;
return 0;
}
代码三(unique+vector)
- 借助
vector的erase
删掉多余的元素 - 借助
vector的size()
直接获取不定数组的长度
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={1,1,2,3,4,5,7,7,10,6};
sort(a,a+10);
vector<int > v(a,a+10);
v.erase(unique(v.begin(),v.end()),v.end());
int index = v.size();
for(int i=0;i<index;i++)
cout<<"a["<<i<<"] = "<<v[i]<<endl;
return 0;
}