最小可用id和bitmap算法

字节逐风师
• 阅读 3714

[18, 4, 8, 9, 16, 1, 14, 7, 19, 3, 0, 5, 2, 11, 6]

比如这个列表,很明显,最小可用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; 
}
点赞
收藏
评论区
推荐文章
九路 九路
4年前
前端学数据结构与算法:二叉树的四种遍历方式及其应用
前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这
SQL抽象语法树及改写场景应用
1背景我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集。比如sql语句,”selectfromt\_userwhereuser\_id10;”,意在从表t\_user中筛选出user\_id大
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
可莉 可莉
3年前
10亿个数中找出最大的10000个数(top K问题)
这个问题还是建立最小堆比较好一些。    先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法(https://www.oschina.net/action
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
Mysql 表分区分类
针对Mysql数据库,表分区类型简析。【1】表分区类型(1)Range分区:按范围分区。按列值的范围区间进行分区存储;比如:id小于10存储在一个分区;id大于10小于20存储在另外一个分区;(2)List分区:按离散值集合分区。与range分区类似,不过它是按离散值进行分区。(3)Hash分区:按hash算法结果分区。对用户定义的表达式所返
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Wesley13 Wesley13
3年前
KNN 算法
KNN算法的全称是KNearestNeighbor,中文为K近邻算法,它是基于距离的一种算法,简单有效。KNN算法即可用于分类问题,也可用于回归问题。1,准备电影数据假如我们统计了一些电影数据,包括电影名称,打斗次数,接吻次数,电影类型,如下:电影名称打斗次数接吻次数
Wesley13 Wesley13
3年前
Java排序算法之选择排序
1\.基本思想选择排序(selectsorting)的基本思想是:1)对于一个大小为n的数组,选择排序共执行n1轮排序2)每轮排序寻找到该轮最小的数放到开始位置上:先假定当前这个数是最小数然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,得到下标当遍历到数组的最
拆解雪花算法生成规则 | 京东物流技术团队
雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为SnowflakeIDs或snowflakes。这种算法由Twitter创建,并用于推文的ID。目前仓储平台生成ID是用的雪花算法修改后的版本。
字节逐风师
字节逐风师
Lv1
不要怪别人让你失望,怪你自己期望过高。
文章
3
粉丝
0
获赞
0