离散化
离散化适用于数据的权值不重要,数据权值之间的相对位置及大小关系重要的一种优化方法。而离散化也有许多方法,其中各有好坏。
1.排序解法(可处理重复元素)
bool cmp(ha c, ha b)
{
return c.num < b.num;
}
int main()
{
scanf("%lld", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &data[i]), a[i].id = i, a[i].num = data[i];
sort(a + 1, a + 1 + n, cmp);
for (int i = 1, j = 0; i <= n; i++)
{
if (a[i].num != a[i - 1].num || i == 1) j++;
data[a[i].id] = j;
}
}
2.STL解法(可处理重复元素)
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), t[i] = a[i];
sort(t + 1, t + n + 1);
m = unique(t + 1, t + n + 1) - t - 1;
for (int i = 1; i <= n; i++)
a[i] = lower_bound(t + 1, t + m + 1, a[i]) - t;//a[i]=返回下标
3.二维离散化(此二维离散化为坐标离散化,非数据离散化)
scanf("%d%d", &l, &w);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &a[i].j, &a[i].i), a[i].id = i;
sort(a + 1, a + 1 + n, cmp1);
for (int i = 1; i <= n; i++)
{
if (a[i].i != a[i - 1].i || i == 1)
cnti++;
yi[a[i].id] = cnti;
}
sort(a + 1, a + 1 + n, cmp2);
for (int i = 1; i <= n; i++)
{
if (a[i].j != a[i - 1].j || i == 1)
cntj++;
xj[a[i].id] = cntj;
}