B站左程云算法视频笔记05
大数据
有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL
(布隆过滤器或者哈希函数分流)
【补充】某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种求出每天热门TOP100词汇的可行办法
32位无符号的整数范围是0~4294967295,现在有40亿个无符号整数,可以使用最多1GB内存,找出所有出现了两次的数。
哈希函数分流
位图,两位表示一个数出现的状态:00 没有出现过,01 出现过一次, 10 出现过两次,11出现过大于2次;
【补充】可以使用最多10MB的内存,怎么找到这40亿个整数的中位数?
范围统计的思想:范围0~,40亿个数,假设只给10KB,找到中位数;
先看10KB能申请多大的无符号整性数组,10KB/4=2500 接近2048即,所以申请int[11]
arr[0] 0~-1
arr[1] ~-1
......
统计每个组的出现次数,到20亿的或刚超20亿的是中位数所在的范围,则继续在该组继续范围统计
问题:给一个10G无序的int文件,利用5G/MB/KB内存实现有序
方法:1)小根堆,以数值value排序,记录出现了几次,共八个字节,由于小根堆会有索引之类的消耗,所以估计为16字节,5G/16B = 5*/=5* 接近
有符号整数是,等分成个
先用小根堆统计最小范围上的数(),排序在新文件中,然后重复
方法2)大根堆
例如有10亿个数,大根堆存三个记录,遍历,找出最小的三个数,存放进新文件,然后重复
位运算:给定两个有符号的32位整数a和b,返回a和b中较大的(要求不用做任何比较判断)
//请保证参数n,不是1就是0的情况下
//1 -> 0
//0 -> 1
public static int flip(int n){return n ^ 1;
}//n是非负数,返回1
//n是负数,返回0
public static int sign(int n){return flip( (n >> 31) & 1 );
}public static int getMax1(int a, int b){int c = a - b;int scA = sign(c);//a-b为非负,scA为1; a-b为负,scA为0int scB = flip(scA); //scA为0,scB为1;scA为1,scB为0//scA为0,scB必为1;scA为1,scB必为0return a * scA + b * scB;
}//a - b 可能会溢出public static int getMax2(int a, int b){int c = a - b;int sa = sign(a);int sb = sign(b);int sc = sign(c);int difSab = sa ^ sb;//a和b的符号不一样,为1;一样为0int sameSab = flip(difSab); //a和b的符号一样,为1;不一样,为0int returnA = difSab * sa + sameSab * sc;int returnB = flip(returnA);return a * returnA + b * returnB;
}
//a和b相同,不溢出,
//a和b不同,a非负,返回a
判断一个32位正数是否是2的幂,4的幂
2的幂:二进制中只有一个位上为1
拿到二进制中最右侧的1,取出来,然后与原始的数相与,看和原始的数是否相等;
或者减1,然后与原数相与为0
4的幂:首先判断是否是2的幂,然后判断1是否在0位2位4位8位。。。
即x & 01010101010101 不等于0 则是4的幂
public static boolean is2Power(int n){return (n & (n - 1)) == 0;
}public static boolean is4Power(int n){return (n & (n - 1)) == 0 && (n & 0x55555555) != 0;//32位010101..
}
给定两个有符号32位整数a和b,不能使用算术运算符,分别实现a和b的加减乘除运算
加法
13: 01101
7: 00111
^ : 01010
&<1: 01010
等同于^+&<1,重复
^ : 00000
&<1: 10100
^ : 10100
&<1: 00000
当&<1为0时,即无进位信息,则得出结果
//如果用户传入的参数,a+b就是溢出的,那么输出溢出
public static int add(int a, int b){int sum =a;while (b != 0){sum = a ^ b;//无进位相加的结果b = (a & b) << 1;//进位信息a = sum;}return sum;
}public static int negNum(int n){return add(~n, 1);
}//相反数public static int minus(int a, int b){return add(a, negNum(b));
}
乘法
public static int multi(int a, int b){int res = 0;while ( b != 0){if ( (b & 1 ) != 0 ){res = add(res ,a);}a << 1;b >>>= 1;}return res;
}
除法:
a / b
a : 0110110
b : 0000101
先让b尽可能左移但不超过a,即b左移3: 0101000
则该位为1,然后将0110110和0101000做差,剩下的因子继续重复
a,b
先让b<<31,看能不能减,再看b<<30,能不能减
假设b<<4是第一次可以减去,则结果一定是10000开头,再看后续能否减去,结果相加。
public static boolean isNeg(int n){return n < 0;
}public static int div(int a, int b){int x = isNeg(a) ? negNum(a) : a;int y = isNeg(b) ? negNum(b) : b;int res = 0;for(int i = 31; i > -1; i = minus(i , 1)){if ((x >> i) >= y){res |= (1 << i);x = minus(x, y << i);}}return isNeg(a) ^ isNeg(b) ? negNum(res) : res;
}
B站左程云算法视频笔记05相关推荐
- B站左程云算法视频笔记(01
1.位运算 异或 ^ ,可理解为不进为相加,满足结合律和交换律 a^a=0: a^0=a: 交换a和b a=a^b: b=a^b: a=a^b: 但必须满足是位置不同的(同一内存位置自己异或结果为0) ...
- B站左程云算法视频高级班01
题目1:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要不能用非基于比较的排序 [ ]假设是长度为9的数组 首先遍历数组 找出min 和 ma ...
- B站左程云算法视频基础提升02
岛问题 一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右相连,如果一片1连在一起,这个部分叫做一个岛,求一个矩阵有多少个岛 思路:遍历,infect class Solution {publ ...
- B站左程云算法视频高级班05
题目一:在一个无序数组中,求第k小的数 快排:荷兰国旗问题 BFPRT 有讲究的选择一个数 之后的步骤和快排一样 假设整个方法叫f函数 f(arr, k) 1)0~4一组 5~9一组 0~14一组 剩 ...
- LeetCode左程云算法课笔记
左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...
- 左程云算法课笔记(1)
认识时间复杂度--常数时间操作 老师在这里拿数组和链表举例何为常数操作: 数组是一块连续的内存空间,当我们要访问数组中的某个元素时,我们可以算距离,怼偏移量,直接把这个数据拿出来,和样本的数据量,即数 ...
- 左程云算法笔记(四)哈希表和有序表的使用、链表
左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...
- 左程云算法笔记总结-基础篇
基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...
- CSDN专访左程云,算法之道
算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...
最新文章
- Apache ServiceComb — Overview
- 哇,居然可以用这种烙铁头拆元器件!!!
- ArcGis Server开发Web GIS新手体验(二)
- C语言和设计模式(外观模式)
- yii mysql 2002_laravel 中出现SQLSTATE[HY000] [2002] 如何解决?
- ios html 图片旋转了,解决移动端iOS下上传图片被旋转问题。
- CMU 15-213 Introduction to Computer Systems学习笔记(5) Machine-Level Programming-Control
- 2017国民行业分类sql-存储过程_存储函数-MySQL
- 计算机考试试题大一上学期,大一第一学期期末考试计算机试题1
- discuz 如何去掉:导读-最新发表
- Java里面的四种内存屏障
- python 20秒画完小猪佩奇“社会人”
- bundle包是什么意思_【Xcode小技巧】生成Bundle包
- ES集群宕机后处理——重新分配shards,负载均衡
- 现货黄金入门与技巧:必须具备的心理素质
- CodeForces - 589J Cleaner Robot
- 关于获取网站嵌入视频源地址方法
- 计算机行业英语单词(二)
- 基于SSH开发的宠物销售商城系统 JAVA MySQL
- c51时钟数码管显示流程图_电子元器件/数码管