Title

离散化(一般写法\unique\unique+vector)

离散化(一般写法\unique\unique+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;
}

参考

[vector、 unique 、erase]

posted @ 2021-07-16 19:14  BeautifulWater  阅读(96)  评论(0编辑  收藏  举报