算法-有序序列中运用“压缩”思想
2017-03-20 14:03
232 查看
我们经常遇到在一个有序序列中进行一系列的操作,比如查找某个元素,插入某个元素,删除某个元素等,这里的有序序列,可能是线性的一对一的序列,也可能是二叉树的一对多序列,那么在面对一个海量的有序序列时,海量数据往往会压迫到我们的神经,让我们沉在数据大海里。
然后有没有一种更好的方法,让我们有针对性地分析这个问题,而不是沉在海量数据中呢? 我们利用有序序列的特点,何不尝试用根据问题的性质,将海量压缩为1个单元数据呢?
如果一个序列是这样的
现在要插入元素190,请问怎么分析这个问题。我们计划用二分查找,查找一个插入元素的合适的位置,然后放入元素。二分查找设计到两个端点,一个中点,并且原数据是有序的。所以,我们直接压缩为1个数据,这个数据时中点数据,
此时的中点位置为n,所以比较 sorted
与 190的大小,假如 sorted
小于190, 则 190只可能位于n后,此时的区间自然变为[n+1, 10000),相反,如果sorted
大于190,则190只能位于n前,即区间[0, n)处。
兑现为代码:
因此根据有序序列,将大量的数据压缩为1个或几个有代表性的数据,可以让问题变得精简!
然后有没有一种更好的方法,让我们有针对性地分析这个问题,而不是沉在海量数据中呢? 我们利用有序序列的特点,何不尝试用根据问题的性质,将海量压缩为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个或几个有代表性的数据,可以让问题变得精简!
相关文章推荐
- 最长有序(非连续)子序列算法
- 稀疏矩阵【压缩算法】,具体代码没有,只是思想
- Java实现合并两个有序序列算法示例
- 小生境思想在多目标优化算法中的运用
- 【算法】 状态压缩 位运算在01集合中点点运用
- 【算法】 状态压缩 位运算在01集合中点点运用
- 查找有序序列中 重复/不存在 的数算法
- Java合并两个有序序列算法实现
- UVA - 1642 Magical GCD(nlogn传统算法思想 序列较短的维护队列)
- 【算法】 状态压缩 位运算在01集合中点点运用
- Facebook开源时间序列内存数据库Beringei,追求极致压缩率——如果是int根据大多数时间序列中的值与相邻数据点相比并没有显著的变化,只要使用XOR将当前值与先前值进行比较,然后存储发生变化的比特。最终,该算法将整个数据集至少压缩了90%
- 【C++实现有序子序列合并算法】
- 数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
- 基本的分治思想算法运用
- 数据结构与算法题目集(中文)——5-53 两个有序序列的中位数 (25分)——链表
- 【算法】合并k个有序的链表-基于最小堆的思想
- YYMMDD转换成4位字符压缩表示算法java实现——应用各位不等进制的思想
- Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。
- 【小算法】从有序序列中取出间隔尽量均匀的N个数组成新有序序列输出
- dp算法思想及运用实践例题