您的位置:首页 > 其它

算法-有序序列中运用“压缩”思想

2017-03-20 14:03 232 查看
我们经常遇到在一个有序序列中进行一系列的操作,比如查找某个元素,插入某个元素,删除某个元素等,这里的有序序列,可能是线性的一对一的序列,也可能是二叉树的一对多序列,那么在面对一个海量的有序序列时,海量数据往往会压迫到我们的神经,让我们沉在数据大海里。

然后有没有一种更好的方法,让我们有针对性地分析这个问题,而不是沉在海量数据中呢? 我们利用有序序列的特点,何不尝试用根据问题的性质,将海量压缩为1个单元数据呢?

如果一个序列是这样的

int sorted[10000] =  {1  4  5  8 12 111  114  115  118 122 2111  2114  2115  2118 2122
2221  2224  2225  2228 2312 2241  2514  2615  2718 2822 2911
3114  3115  3118 3222 4221  4224  4225  4228 4312 4641  4714  4815
4918 4922 5011  };


现在要插入元素190,请问怎么分析这个问题。我们计划用二分查找,查找一个插入元素的合适的位置,然后放入元素。二分查找设计到两个端点,一个中点,并且原数据是有序的。所以,我们直接压缩为1个数据,这个数据时中点数据,

n


此时的中点位置为n,所以比较 sorted
与 190的大小,假如 sorted
小于190, 则 190只可能位于n后,此时的区间自然变为[n+1, 10000),相反,如果sorted
大于190,则190只能位于n前,即区间[0, n)处。

兑现为代码:

public static int searchInsertLocation(int[] sorted, int e)
{
int lo = 0;
int hi = sorted.Length;
while (lo < hi)
{
int mi = (lo + hi) >> 1;
if (e < sorted[mi])
hi = mi;
else
lo = mi + 1;
}
return lo;
}


因此根据有序序列,将大量的数据压缩为1个或几个有代表性的数据,可以让问题变得精简!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐