zoukankan      html  css  js  c++  java
  • 进阶指南---基本算法【阅读笔记】

    成对变换

    对于非负整数(n):

    当(n)为偶数时,(n xor 1)等于(n+1)

    当(n)为奇数时,(n xor 1)等于(n - 1)

    “0 和 1”, “2 和 3”, “4 和5”......关于(xor 1)运算构成“成对变换”

    这一性质常用于图论邻接表中边集的存储。在具有无向边(双向边)的图中把一对正反方向的边分别存储在邻接表数组的第(n)和(n+1)位置((n)是偶数)

    通过(xor 1)运算可以得到当前边和反向边的存储位置。

    (lowbit)

    (lowbit(n))定义为非负整数(n)在二进制表示下“最低位的1及其后边所有的0”构成的数值。

    (lowbit(n) = n & (~n + 1) = n & (-n))

      因为假设(n)的第(k)位是(1), 第(0~k-1)位都是(0)

      (~n)的第(k)为是(0), 第(0~k-1)都是(1)

      那么(~n + 1)的第(k)是(1), 第(0~k-1)都是(0)

      其实根据补码的一种求法也可以知道,(~n +1)的高位到第(k+1)位都和(n)相反,(0~k)位不变。

      进行(&)运算后得到的就是(lowbit(n))

    (lowbit)加Hash可以找出整数二进制表示下所有是1的位,复杂度与1的个数同级。只需要每次做(n = n - lowbit(n))的操作

    用一个Hash数组来存储2的幂次,(H[2^{k} mod 37] = k), (forall k in [0,35], 2^{k} mod 37互不相等,且恰好取遍1~36)

    二分

    右移运算( >> )是向下取整,而整数除法是向零取整,对于二分值域包含负数时后者不能正常工作。

    实数域上的二分

    确定好精度(eps)以(l+eps<r)为循环条件。

    保留(k)位小数的题目中,取(eps = 10 ^ {-(k+2)})

    或者采用循环固定次数的二分方法。

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9951397.html
Copyright © 2011-2022 走看看