我对离散化的一些感悟

这几天在做线段树的专题,不免遇到一些题,数据很大,如果直接建树,会造成内存超出限制,这时就要进行离散化了。

如果是区间的离散化,一般区间会涉及覆盖关系, 那么运用离散化之后,区间的覆盖关系不能变,例如:

1——10 ,2——7 ,3——11,6——22;
将坐标从小到大排序,也就是1,2,3,6,7,10,11,22

那么新的区间也就是
1——6
2——5
3——7
4——8
覆盖关系没变,但是值小了很多,瞬间就减少了内存消耗

int seg[maxn][2];//保存原来的点

struct node
{
int p;
int line;
}mat[maxn<<1]

for(.....)
{
scanf(".....");
mat[i<<1].line=-(i+1);
mat[i<<1|1].line=(i+1);
mat[i<<1].p=seg[i][0];
mat[i<<1|1].p=seg[i][1];
}

sort(mat,mat+2*n,cmp);
for(.....)
{
if(temp!=seg[i].p)//防止相同端点映射到不同的点,temp是上一个点
{
ans++;
temp=seg[i].p;
}
if(mat[i].line<0) //左边,line 存的就是第i+1条边
seg[-mat[i].line-1][0]=ans;//离散这条边的左端
else
seg[mat[i].line-1][1]=ans;//离散这条边的右端
}

这样的话,离散前的点是没了,如果我们不需要离散前的点,那么可以这么做,如果需要的话,可以开数组保存下来或者用map,把离散前的坐标当成key,离散化的做value。这样即离散了坐标,也保留了原坐标

离散化适用于处于数据极大时的情况,例如应用在线段树上。
牛顿插值法是一种数值分析方法,用于估算函数在某点的精确值,通过构建多项式函数来逼近数据点。在MATLAB中,使用`polyfit`和`polyval`函数可以方便地实现牛顿插值。以下是MATLAB中应用牛顿插值的一些常见步骤和感受: 1. **数据准备**:首先,你需要有一组已知的数据点,通常是x-y坐标对,表示函数在某些特定点的值。 2. **创建多项式**:`polyfit`函数接收这些数据点作为输入,返回一个多项式的系数,该多项式可以最准确地通过这些点。 ```matlab x_data = ...; % x坐标数据 y_data = ...; % y坐标数据 coeffs = polyfit(x_data, y_data, degree); % degree是你想要的多项式阶数 ``` 3. **插值评估**:有了多项式的系数,你可以用`polyval`函数在新的x值上计算对应的y值,这相当于进行了插值。 ```matlab new_x = ...; % 插值的新x值 interpolated_y = polyval(coeffs, new_x); ``` 4. **误差分析**:牛顿插值对于离散数据点的效果通常很好,但如果数据点分布不均匀或者函数变化剧烈,插值可能会产生较大的误差。 5. **性能优化**:如果处理大量数据或复杂函数,可能需要考虑算法的效率,如使用更高级的插值方法(如样条插值)或并行化处理。 **MATLAB感悟**: - 牛顿插值法直观易懂,但其精度受限于数据点的数量和分布。 - 在实际应用中,选择合适的插值方法至关重要,它能影响结果的准确性和计算效率。 - MATLAB提供了强大的工具集,使得插值操作变得简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值