首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

(53) 剖析Collections - 算法 计算机程序的思维逻辑

我们来分析下效率,如果List支持随机访问,效率为O(log2(N)),如果通过迭代器,比较的次数为O(log2(N)),但遍历移动的次数为O(N),N为列表长度。...super T> c) 使用很简单,就不举例了,内部它是通过Arrays.sort实现的,先将List元素拷贝到一个数组中,然后使用Arrays.sort,排序后,再拷贝回List。...> list, int distance) distance表示循环移位个数,一般正数表示向右移,负数表示向左移,比如: List list1 = Arrays.asList(new...根据列表长度size和移位个数distance,可以计算出两个子列表的分隔点,有了两个子列表后,两个子列表的顺序交换可以通过三次翻转实现,比如有A和B两个子列表,A有m个元素,B有n个元素: ?...从数学的观点来说,翻转被称为"转置"操作,我们用上标T表示转置,BA等价于AB的三次转置,即: ? 这个算法的整体实现代码为: private static void rotate2(List<?

1.3K90

查找算法

这里 -1 代表数组中不存在要查找个数。 顺序查找的时间复杂度为 O(n)。...二分查找 下面来看看看二分查找,二分查找适用于排序之后的数组,算法的思想也很简单:首先对数组进行排序,每次用数组中的中间那个数字和要查找的数字相比较,如果数组中间的那个数字大于要查找的那个数字,那么在数组的左半边继续执行二分查找...散列查找 最后来看一下散列查找,上面提到过,散列查找是基于标记数组的思想,而且通过散列查找我们不仅能够对整形数字进行查找,还能够对一些非整形数字的数据类型(字符串、浮点数)进行查找。...对于这个问题,我们可以通过取余来解决:我们限定一个数组的最大下标值,然后把所有算得到的整数值取余这个最大下标就行了。...还有一个问题:对于一个下标只能储存一个值,如果出现了两个字符串转换出来的数组下标相同的情况怎么办呢,我们可以采用移位来处理,将冲突的那个字符串转换的数组下标的整形值通过变换数值来避免冲突,进而储存,下面给出代码

67920
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript笔记

Math.max.apply 来查找数组中的最高值: Math.min.apply 来查找数组中的最低值 数组迭代 Array.forEach() 方法为每个数组元素调用一次函数(回调函数) Array.map...() 类似,但是从数组结尾开始搜索 Array.find() 方法返回通过测试函数的第一个数组元素的值 Array.findIndex() 方法返回通过测试函数的第一个数组元素的索引 日期...,n) 返回最低值 pow(x,y) 返回 x 的 y 次幂 random() 返回 0 ~ 1 之间的随机数 round(x) 把 x 四舍五入为最接近的整数 sin(x) 返回 x(x 以角度计)的正弦...\w 匹配单个字符 \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。 量词 n+ 匹配任何包含至少一个 n 的字符串。 n* 匹配任何包含零个或多个 n 的字符串。...HTML元素 document.getElementById(id) 通过元素 id 来查找元素 document.getElementsByTagName(name) 通过标签名来查找元素 document.getElementsByClassName

2.1K10

Python这些位运算的妙用,绝对让你大开眼界!

位运算常用的运算符包括&(按位与), | (按位或),~(按位非),^(按位异或),>(有符号右移位)。 下面用几个例子说明其应用,希望对你有所启发。...4、寻找数据列表中的独一无二 有一个数据列表(2N+1个整数),只有一个数出现了1次,其余N个数都出现了2次。如何找到这个独一无二的数据?...看到这个题目,相信大家第一次想到的算法肯定是计数,建立列表,循环整个数据并计数,然后遍历这个列表找到出现次数为1的数据。 这样,空间复杂度为O(N)。 如何降低空间复杂度呢?...那么,出现了2次的N个数异或的结果是0,再与出现次数为1次的数异或的结果即为该数。即:找到这个独一无二数据的办法是通过对全部的数据进行异或操作,空间复杂度降低为O(1)。...5、计算一个数值的二进制数中有多少个1 相信有了之前的基础,大家很容易实现这个算法。单纯的通过位运算,与1进行与运算,看是否结果为1,然后右移1位,继续判断。

1.2K20

唯快不破的01序列——位运算初识

书面语言是这么讲的:移位运算为什么比乘法除法快? 从效率上看,使用移位指令有更高的效率,因为移位指令占2个机器周期,而乘除法指令占4个机器周期。从硬件上看,移位对硬件更容易实现。...重点来了,除了改进机械计算机,Leibniz还发明了二进制,它成为了今天计算机的基础。然并卵,Leibniz设计的计算器还是十进制的,和二进制无关,而他发明二进制,从某种程度上是为了证实上帝的伟大。...Shannon的想法简单地讲,就是所有的加减乘除运算都可以变成布尔的二进制的逻辑运算(至于Boole大佬,二进制逻辑运算是他在19世纪发明的),而那些二进制的逻辑运算,可以通过简单的电路实现。...~1100 = 0011.还记不记得树状数组那里说过一个数nn+(~n)=-1?显然加完所有位全是1,补码表示中32位1代表的值就是-1....0001 = 1.所以我们表达2的n次幂常常写成:1<<n

96340

java概念1

,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。...<<= 左移位赋值。 >>= 右移位赋值。 >>>= 无符号右移位赋值。 &= 按位与赋值。 |= 按位或赋值。 ^= 按位异或赋值。...只读            DOM是一种基于树状的查找方式。 DOM会将xml解析成一棵树,存在内存中。开发者可以通过查找树的节点来取得文件的内容或者修改内容。可读写。...这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。...{ int i, j, gap; int temp; for (gap=n/2;gap>0;gap/=2){//计算gap大小 for(i=gap;i<n;i++){//将数据进行分组

981110

【05】消失的数字

思路1: 先求出数组所有数的和sum1,因为是0~n连续的,只要一个数没有两个,所有我们求出所有两个0 ~n的数的和sum2,再将它们相减即可得到消失的数字 图解如下: 思路2: 利用位操作符来求解...,详情点击这里查看: 位与移位操作符详解 按位异或操作符:相同为假,相异为真 而两个相同的数字按位异或得出的结果却是0,因为它们所有位都相同 2.消失的数字完整代码求解 方法一: int missingNumber...{ sum-=i;//少了一个数的和减去没有少的得到消失的数字的负数 } return -sum;//返回相反数即可 } 结果如下: 这里的时间复杂度为O(n),符合题意,上面for循环为...n,下面也为n,加起来2n,也就是O(n)....,符合题意,上面for循环为n,下面也为n,加起来2n,也就是O(n). 3.结语 ✨✨以上就是消失的数字的两种题解啦~ 一种是求和求解,另一种是利用按位异或的特点来求解,两种方法有异曲同工之处,

6910

数学题:查找,快速幂,二进制,剪绳子

就当做刷题过程中的一个调味剂,享受一下刷题的乐趣吧~ ---- 一、二维数组查找 leetcode 面试题04 --- 二维数组中的查找【简单】 ?...第一次二分法先查找给定的值在整个数组中的哪一行,首先确定行号。第二次二分法我们用于定位一列。最终查找到结果值。...题目描述 1、解题思路 方法一: 首先想到的肯定是循环移位啦~对给定的数字进行循环移位,不断的左移,然后和1做与运算,每次结果为1的时候累加一次。直到最后的数字为0,停止累加,返回给定的结果。...1置为0,得到100 n-1=4 100 所以我们依据这种方法,可以循环的将n&(n-1)的值赋给n,然后每次循环时计数,直到最后n==0,此时计数结果即为最后n中1的个数。...2、实现代码 //方法一:循环移位 public int hammingWeight(int n) { int res = 0 ; while(n !

45930

Java中对于位运算的优化以及运用与思考

乘法与左移位 左移一位,相当于乘以2,左移n位,相当于乘以2的n次方。...“取余”与“取与”运算 对于2的n次方取余,相当于对2的n次方减一取与运算,n为正整数。为什么呢?通过下图就能很容易理解: 十进制中,对于10的n次方取余,直观来看就是: ?...2的n次方,当然这也是因为是平衡二叉查找树算法的实现。...我们在写框架的很多时候,想让用户传入一个必须是2的n次方的参数来初始化某个资源池,但这样不是那么灵活,我们可以通过用户传入的数字N,来找出不大于N的最大的2的n次方,或者是大于N的最小的2的N次方。...抽象为比较直观的理解就是,找一个数字最左边的1的左边一个1(大于N的最小的2的N次方),或者是最左边的1(小于N的最大的2的N次方),前提是这个数字本身不是2的n次方。 ? 那么,如何找呢?

79421

Java基础 -- 位运算

详解 Java位运算细化划分可以分为按位运算和移位运算,见下表。...,高位丢弃,低位补0 移位运算 >> 右移 各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1 移位运算 >>> 无符号右移 各二进制位全部右移N位,无论正负,都在高位插入0...应用 不用额外的变量实现两个数字互换 见参考资料中的BitOperationTest,方法reverse通过三次异或操作完成了两个变量值的替换。...判断一个数的奇偶性 通过与运算判断奇偶数,伪代码如下: n&1 == 1?”奇数”:”偶数” 奇数最低位肯定是1,而1的二进制最低位也是1,其他位都是0,所以所有奇数和1与运算结果肯定是1。...查找落单的数 将数组的数全部做异或,最后得到的数就是要找的数,因为和一个数做两次异或不会改变。 参考文章: 一文搞懂位运算

59120

面试中如果这样写二分查找

二分查找的时间复杂度 二分查找每次把搜索区域减少一半,时间复杂度为O(logn)。(n代表集合中元素的个数)。 空间复杂度为O(1)。...入参n就是代表要查找序列的长度,入参f就是我们自定义的条件。...,找到我们最终的那个数值,如果当前序列中没有我们要找的目标数值,那么就会返回我们可以插入的位置,也就是最后一位元素的坐标+1的位置。...这个逻辑说实话,我也是第一次接触,仔细思考了一下,这种实现还是有一些优点的: 使用移位操作,避免因为i+j太大而造成的溢出 如果我们查找序列中有多个元素相等时,且我们要找的元素就是这个时,我们总会找到下标最小的那个元素...这里使用到的是移位操作,通过向右移动一位,正好可以得到/2的结果。具体什么原因呢,我画了一个图,手工画的,看完你就懂了: 懂了吧,兄弟们!

17310

BitMap 算法

算法思想 32位机器上,一个整形,比如 int a; 在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询。...优点: 效率高,不许进行比较和移位 占用内存少,比如N=10000000;只需占用内存为N/8 = 1250000Bytes = 1.2M,如果采用int数组存储,则需要38M多 缺点:...无法对存在重复的数据进行排序和查找 示例: 申请一个int型的内存空间,则有4Byte,32bit。...map映射表 假设需要排序或者查找的总数N=10000000,那么我们需要申请的内存空间为 int a[N/32 + 1].其中a[0]在内存中占32位,依此类推: bitmap表为:...(2)求十进制数0-N对应的bit位 bit_loc = N % 32即可,例如 n = 76, bit_loc = 76 % 32 = 12 (3)利用移位0-31使得对应的32bit

2.2K60

Golang实现分布式唯一ID生成器

二:128位的UUID生成:这种方法可以生成128位的UUID,官方说UUID每秒可以生成100万个,并且等到100年重复的概率才达到50%。但是这个方案有个缺点是UUID不是有序增长的。...今天用Golang实现一个雪花ID生成器的组件,顺便加深对分布式唯一ID生成器的理解,也可以独立成一个服务,通过RPC请求将ID返回给对应的服务。...// 雪花ID 64位 第一位是符号位,一般是0// 1-42位是毫秒时间戳位(41位)// 5位工作中心, 最多可以表示32个数据中心// 5位机器id,最多可以有32台机器// 12位序号位,同一毫秒能生成...\n")done <- struct{}{}return}hm[num] = struct{}{}if i == cnt {t.Logf("取完%d次数据了,监控协程退出\n", cnt)done <-...如果监控协程检查到有重复元素就通知父协程退出,父协程再通过context上下文通知正在生成ID的子协程退出。

46610

HashMap 这一篇就够了

囧辉:主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。 二狗:那在什么时候用链表?什么时候用红黑树?...假设 n 的值为 0010 0001,则该计算如下图: ? 相信你应该看出来,这5个公式会通过最高位的1,拿到2个1、4个1、8个1、16个1、32个1。...这时再看开头的 cap - 1 就很简单了,这是为了处理 cap 本身就是 2 的N次方的情况。 计算机底层是二进制的,移位和或运算是非常快的,所以这个方法的效率很高。...囧辉:JDK 1.8 的主要优化刚才我们都聊过了,主要有以下几点: 1)底层数据结构从“数组+链表”改成“数组+链表+红黑树”,主要是优化了 hash 冲突较严重时,链表过长的查找性能:O(n) ->...2)计算 table 初始容量的方式发生了改变,老的方式是从1开始不断向左进行移位运算,直到找到大于等于入参容量的值;新的方式则是通过“5个移位+或等于运算”来计算。

99820

由散列表到BitMap的概念与应用(一)

也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 散列表是种数据结构,它可以提供快速的插入操作和查找操作。...,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。...二次探测:是针对线性探测的一个改进,线性探测后插入的key值太集中,这样造成key值通过散列函数后还是无法正确的映射到地址上,太集中也会造成查找、删除时的效率低下。...优点: 运算效率高,不许进行比较和移位; 占用内存少,比如N=10000000;只需占用内存为N/8=1250000Byte=1.25M。 缺点:所有的数据不能重复。...求0-N对应0-31中的数:十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得对应0-31中的数。 利用移位0-31使得对应32bit位为1。

2K20

C语言编程入门之--第五章C语言基本运算和表达式-part4

再看看十进制的228,二进制为11100100,右移一位变为01110010,十进制值为114,在C语言中有移位运算符 >> 和 << 专门用来让数据移位,如下代码, #include <stdio.h...难点来了,如果类型是带负号的 char 型呢?...八个字节中,第一位是符号位,如果是0表示符号为正,如果是1表示符号为负,因为笔者写文章动力不足,所以笔者打算不讨论这块,希望读者自行去了解这块知识,可以借助windows的计算机结合写代码来分析有符号的数据移位规律是怎样的...同理,按位或运算 | ,就是左边和右边两个数的每一位进行比对,如果有一个位是1就取1,其它取0。 异或运算 ^ ,左边和右边两个数的每一位进行对比,如果相同取0,不同取1。  ...非运算 ~ ,上面三个运算有左边的数和右边的数,非运算只针对一个数进行运算,就是将这个数的每一位都取反,也就是如果是0就取1,如果是1就取0。

60830

如何设计一个搜索引擎

4.5 树 链表的插入和删除比较快,但是查找却比较慢,因为不管我们查找什么数据,都需要从链表的第一个数据项开始,遍历到找到所需数据项为止,这个查找也是平均需要比较N/2次。...2.减少查找过程中磁盘I/O的存取次数。 局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。...⑤、通过临时索引创建倒排索引 ⑥、记录单词编号在倒排索引文件的偏移位置 帮助我们快速地查找某个单词编号在倒排索引中存储的位置,进而快速地从倒排索引中读取单词编号对应的网页编号列表。...③、我们拿这 k 个单词编号,去 term_offset.bin 对应的散列表中,查找每个单词编号在倒排索引文件中的偏移位置。经过这个查询之后,我们得到了 k 个偏移位置。...④、我们拿这 k 个偏移位置,去倒排索引(index.bin)中,查找 k 个单词对应的包含它的网页编号列表。经过这一步查询之后,我们得到了 k 个网页编号列表。

2.4K10

hash算法原理详解

例2,要构造一个数据元素个数n=80,哈希长度m=100的哈希表。...折叠法中数位折叠又分为移位叠加和边界叠加两种方法,移位叠加是将分割后是每一部分的最低位对齐,然后相加;边界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。...哈希函数 H(key)=“key2的中间几位”因为这种方法的原理是通过取平方扩大差别,平方值的中间几位和这个数的每一位都相关,则对不同的关键字得到的哈希函数值不易产生冲突,由此产生的哈希地址也较为均匀。...1.7n之间的一个素数(n为存在的数据元素个数) 8.随机数法:            设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数 此法适于:对长度不等的关键字构造哈希函数...l 记录查找频率 三.Hash处理冲突方法 通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。

4.1K50
领券