Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

位运算 异或:相同为0,不同为1.也可用"不进位加法"来理解

异或操作的一些特点:
x^0 = x
x ^ 1s=~x // 注意 1s=~0 (简称 全1)
x^(~x)=1s
x^x=0
c = a^b => a^c=b,b^c=a // 交换两个数
a^b^c = a^(b^c)=(a^b)^c  //

指定位置的位运算:
    1、将x最右边的n位清零:x & (~0<<n)
    2、获取x的第n位值 (0或者1):(x>>n)&1
    3、获取x的第n位的幂值:x&(1<<n)
    4、仅将第n位置为1:x|(1<<n)
    5、仅将第n位置为0:x&(~(1<<n))
    6、将x最高位至第n位(含)清零:x&((1<<n)-1)

实战位运算要点
    1、判断奇偶
        x%2 == 1 -> (x&1) == 1
        x%2 == 0 -> (x&1) == 0
    2、x >> 1 -> x/2
        即: x=x/2; -> x = x >>1
         mid = (left+right)/2 -> mid=(left+right) >> 1
    3、x=x&(x-1) 清零最低位的1
    4、x & -x => 得到最低位1
    5、x&~x => 0
多皇后模板:
    https://shimo.im/docs/YzWa5ZZrZPYWahK2/read

布隆过滤器
    它由一个bit数组和一组Hash算法构成。可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1)
    一个很长的 二进制向量和一系列随机映射函数。布隆过滤器用于检索一个元素是否在一个集合中
    优点:
        空间效率和查询时间都远远超过一般算法
    缺点:
        有一定的误识别率和删除困难
LRU CACHE
    1、记忆
    2、钱包-储物柜
    3、代码模板


    两个要素:大小、替换
    Hash Table + Double LinkdList
    O(1)查询
    O(1)修改。更新

    CPU CACHE
        三级缓存

排序
    https://www.cnblogs.com/onepixel/p/7674659.html
    1、比较类排序
        时间复杂度不能突破 O(nlogn)
        交换排序
        插入排序
        选择排序
        归并排序
    2、非比较类排序
        对于整型
        可以达到 O(n+k)
        计数排序
        桶排序
            与计数排序的区别,计数排序是对应的下标是有序的连续的下标的桶排序
            桶排序是有一个函数要计算桶的下标,可以理解为计数排序的升级版
        基数排序
    初级排序O(n^2)
        1、选择排序
            每次找最小值,然后放到待排序数组的起始位置
        2、插入排序
            从前到后逐步构建有序序列;对于未排序数据,在已排序序列中从后向前扫描,找到响应位置并插入
        3、冒泡排序
            嵌套循环,每次查看相邻的元素如果逆序,则交换
    高级排序 O(nlogn)
        快速排序
            数组取标杆pivot,将小元素放pivot左边,大元素方右侧,然后依次对右边和左边子数组继续排序;以达到整个序列有序
        归并排序 --分治
            1、把长度为n的输入序列分成两个长度为n/2的子序列
            2、对这两个子序列分别采用归并排序
            3、将两个排好序的子序列合并成一个最终的排序序列
        归并和快排具有相似性,但步骤顺序相反
            归并:先排序左右子数组,然后合并两个有序子数组
            快排:想调配出左右子数组,然后对左右子数组进行排序
        堆排序:
            堆插入 O(logn),取最大值/小值 O(1)
            1、数组元素依次建立小顶堆
            2、依次取堆顶元素,并删除