[TOC]
一、位运算
XOR-异或 ^
- x ^ 0 = x
- x ^ 1s= ~x //1s = ~0
- x ^ (~x) = 1s
- x ^ x = 0
- c = a ^ b ==> a ^ c = b, b ^ c = a //交换两个数 swap
- a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c //associative
1、指定位置的位运算
- 将x最右边的 n 位清零:x & (!0 << n)
- 获取 x 的第 n 位值(0 或者 1):(x >> n) & 1
- 获取 x 的第 n 位的幂值:x & (1 << (n - 1))
- 仅将第 n 位置为1:x | (1 << n)
- 仅将第 n 位置为0:x & (~ (1 << n))
- 将 x 最高位至第 n 位(含) 清零:x & ((1 << n) - 1)
- 将第 n 位至第 0 位(含)清零:x & (~((1 << n + 1) - 1))
实战:N皇后、布隆过滤器都可以用到位运算,以后尽量用位运算
- 判断奇偶:
- x % 2 == 1 -->(x & 1) == 1
- x % 2 == 0 -->(x & 1) == 0
- x >> 1 -----> x / 2
- x = x & (x - 1) 清零最低位的1
- x & -x ==> 得到最低位的1
- x & ~x ==> 0
二、布隆过滤器
判断是否存在,存在那么可能存在,不存在那么一定不存在
三、LUR cache
Least Recently Used cache
最近使用算法
四、排序
记住:O(n log(n)) :不稳定:快速、堆排。稳定:归并
初级排序 O(n^2)
1、选择排序(selection Sort)
- 每次找最小(大)值然后放到待排序数组的起始(结束)位置。
2、插入排序(insertion Sort)
- 从前到后逐步构建有序序列;对于未排序数据,在已排序序列中从后向前扫描,找到相应(有序)位置并插入。
3、冒泡排序(Bubble Sort)
- 嵌套循环,每次查看相邻d饿元素如果逆序,则交换。
高级排序 O(N*Log(N))
1、快速排序(Quick Sort)
- 数组取标杆pivot,将小元素放pivot左边,大于素放在右侧,然后依次对左边和右边的子数组继续快排;以达到整个序列有序。
2、归并排序(Merge Sort)-分治
- 把长度为 n 的输入序列分为两个长度为 n/2 的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
快排和归并区异
归并 和 快排 具有相似性,但步骤顺序相反
归并:先排序左右子数组,然后合并两个有序子数组
快排:先调配处左右子数组,然后对于左右子数组进行排序
3、堆排序(Heap Sort)-堆插入O(log N),取最大/小值 O(1)
- 数组元素依次建立小顶堆;
- 依次取出堆顶元素,并删除。
- 说明:
特殊排序 - O(N)
1、计数排序(Counting Sort)
- 计数排序要求输入的数据必须是有确定范围的整数。将输入的数据转化为键存储在额外开辟的数组空间中;然后依次把计数大于 1 的填充回原数组。
2、桶排序(Bucket Sort)
- 桶排序的工作原理;假设输入数据服务均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。
3、基数排序(Radix Sort)
- 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先排序,再按高优先排序。