最小可用id和bitmap算法
2015-03-16 14:41
204 查看
[18, 4, 8, 9, 16, 1, 14, 7, 19, 3, 0, 5, 2, 11, 6]
比如这个列表,很明显,最小可用id为10
最简单的算法也异常简单,就是1-18每个数都进行一次遍历,找到为止,但是性能也可想而知的非常差
我们进行第一步优化
就是将这些id,第一次遍历后进行一次索引,然后再查找起来就非常简单了
下面再进行一次,存储方面的优化,如果我们用位存储来做是否有这个数字的标记,就可以节省大量的空间
比如这个列表,很明显,最小可用id为10
最简单的算法也异常简单,就是1-18每个数都进行一次遍历,找到为止,但是性能也可想而知的非常差
我们进行第一步优化
就是将这些id,第一次遍历后进行一次索引,然后再查找起来就非常简单了
下面再进行一次,存储方面的优化,如果我们用位存储来做是否有这个数字的标记,就可以节省大量的空间
#define N 1000000 // 1 million #define WORD_LENGTH sizeof ( int ) * 8 void setbit (unsigned int* bits , unsigned int i ) { bits[i / WORD_LENGTH] |= 1<<(i % WORD_LENGTH);//或运算,将32个bit位按照0/1存储 } int testbit (unsigned int* bits , unsigned int i ) { return bits[i/WORD_LENGTH] & (1<<(i % WORD_LENGTH));//只要结果不为0,此位置便有数据 } unsigned int bits [N/WORD_LENGTH+1]; int min_free(int *xs, int n) { int i , len = N/WORD_LENGTH+1;//确定初始化bit数组长度 for(i=0; i<len; ++i) bits[i]=0; //初始化bits数组,全部填充0 for(i=0; i<n; ++i) if (xs[i] <n) setbit(bits, xs[i]); for(i=0; i<=n; ++i) if(!testbit(bits, i)) return i; }
相关文章推荐
- 【用JavaScript学算法】最小可用ID
- 【python算法】为了找到最小的可分配ID实例
- 图论;最小生成树;普利姆算法;贪心策略;可用最小堆实现;
- Sql语句求最小可用id
- (算法)辗转相除法求最大公约数和最小公倍数
- 贪婪算法---最小耗费生成树
- 我的ID生成算法
- 最小生成树算法讨论
- 使用求出最大和最小ID进行分页
- 常用算法(C#): 求一个数的最小公倍数
- Bitmap 任意切割算法
- 最简单的算法:求两个数的最小公倍数
- 算法练习一:最大公约数与最小公倍数
- 贪心算法——最小的单位闭区间集
- 最大公约数和最小公倍数的算法
- ID生成算法 小议
- TopCoder 算法比赛图论实战1—最小生成树问题
- asp.net(c#)两种随机数的算法,可用抽考题
- 最新可用NOD32免ID升级服务器
- ID3 算法可视化解读