大数据

有一个包含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相关推荐

  1. B站左程云算法视频笔记(01

    1.位运算 异或 ^ ,可理解为不进为相加,满足结合律和交换律 a^a=0: a^0=a: 交换a和b a=a^b: b=a^b: a=a^b: 但必须满足是位置不同的(同一内存位置自己异或结果为0) ...

  2. B站左程云算法视频高级班01

    题目1:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要不能用非基于比较的排序 [               ]假设是长度为9的数组 首先遍历数组 找出min 和 ma ...

  3. B站左程云算法视频基础提升02

    岛问题 一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右相连,如果一片1连在一起,这个部分叫做一个岛,求一个矩阵有多少个岛 思路:遍历,infect class Solution {publ ...

  4. B站左程云算法视频高级班05

    题目一:在一个无序数组中,求第k小的数 快排:荷兰国旗问题 BFPRT 有讲究的选择一个数 之后的步骤和快排一样 假设整个方法叫f函数 f(arr, k) 1)0~4一组 5~9一组 0~14一组 剩 ...

  5. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

  6. 左程云算法课笔记(1)

    认识时间复杂度--常数时间操作 老师在这里拿数组和链表举例何为常数操作: 数组是一块连续的内存空间,当我们要访问数组中的某个元素时,我们可以算距离,怼偏移量,直接把这个数据拿出来,和样本的数据量,即数 ...

  7. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  8. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  9. CSDN专访左程云,算法之道

    算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...

最新文章

  1. Apache ServiceComb — Overview
  2. 哇,居然可以用这种烙铁头拆元器件!!!
  3. ArcGis Server开发Web GIS新手体验(二)
  4. C语言和设计模式(外观模式)
  5. yii mysql 2002_laravel 中出现SQLSTATE[HY000] [2002] 如何解决?
  6. ios html 图片旋转了,解决移动端iOS下上传图片被旋转问题。
  7. CMU 15-213 Introduction to Computer Systems学习笔记(5) Machine-Level Programming-Control
  8. 2017国民行业分类sql-存储过程_存储函数-MySQL
  9. 计算机考试试题大一上学期,大一第一学期期末考试计算机试题1
  10. discuz 如何去掉:导读-最新发表
  11. Java里面的四种内存屏障
  12. python 20秒画完小猪佩奇“社会人”
  13. bundle包是什么意思_【Xcode小技巧】生成Bundle包
  14. ES集群宕机后处理——重新分配shards,负载均衡
  15. 现货黄金入门与技巧:必须具备的心理素质
  16. CodeForces - 589J Cleaner Robot
  17. 关于获取网站嵌入视频源地址方法
  18. 计算机行业英语单词(二)
  19. 基于SSH开发的宠物销售商城系统 JAVA MySQL
  20. c51时钟数码管显示流程图_电子元器件/数码管

热门文章

  1. 写专利还是比较辛苦的
  2. 《数据结构与算法》之课程实验
  3. P3580 [POI2014]ZAL-Freight(单调队列dp)
  4. 掌财社:Java项目案例之客户信息管理系统的实现
  5. vue3-video-play视频组件的使用(一)——基本使用 HTML5中Video标签的属性、方法和事件汇总
  6. 小程序获取微信运动步数并集成echarts报表显示
  7. 海量传感数据管理系统功能要求与总体结构
  8. 苹果手机视频去水印软件
  9. where条件中有权限校验的自定义函数优化方法
  10. D3 JS study notes