时间复杂度、对数器、二分法与异或运算
常数时间的操作、固定时间的操作
算术运算, 位与运算,、自增、自检、比较、 寻址(偏移量)得到当前值, 数组的寻址操作
时间复杂度: 只关心量级,
异或运算 异或运算:相同为0,不同为1 同或运算:相同为1,不同为0
+1 为什么是或运算?
左移 == 乘2
程序设计=数据结构+算法
什么是算法
巧妇难为无米之炊,
巧妇 == 算法. 数据结构 == 米
根据具体的问题,设计解决问题的具体流程。
根据一定的条件, 对一些数据进行计算,得到需要对结果 (可以解决具体的问题)
有设计解决的具体流程 (高斯算法)
花费最少的时间完成需求,占据最少内的存完成需求被称之为优质的算法 (有评价这个算法的具体指标=时间空间复杂度)
时间复杂度
空间复杂度
位运算
逻辑位运算
位移位运算
& 位与 | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| 位或 | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ 异或 | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
〜 取反 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< 左移 | 按位左移运算符。左操作数按位左移右操作数指定的位数。 简单理解成 左移几位就相乘了几 | A << 2得到240,即 1111 0000 |
>> 右移 | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
^
异或 == 无进位相加
异或运算就记成无进位相加 : 二进制的相加 同样的一批数异或得到的结果值一定是一样的 0^n == n n^n == 0 // 解释: 二进制的无进位相加
异或运算 A ^ b 满足交换率和结合率 前提: 同一块内存 ^ 运算会变成 0
位与运算 A & A 取反+1 的结果 =
位图
压缩空间,
一个int 占4个byte 一个byte占4bit,
时间复杂度
可达性分析:
理解成树结构-》 找子树或者叶子结点 都能够找得到
Java
- 值传递
- 不会认内存地址, 就看自面值
- 和引用传递
- 会认内存地址
因为java只有一种传递参数的方式:值传递。 在值传递中,实参的值被传给形参,方法体内对形参的任何赋值操作都不会影响到实参。 对形参的任何赋值操作都不会影响到实参,但是对于形参的字段,或者元素(假如形参是一个数组)的赋值操作会影响实参。 map在put 的时候, key 如果是基本类型+string类型, 默认是按照字面值, 如果是自己定义的对象, 是按照引用查找 引用传递 在map中只会存在引用地址, 值传递 对于原方法是不可见的 引用传递对于原方法是可见的(A方法定义了一个 obj 传递给B方法, B方法对Obj做了修改是可见的)
二进制
计算机中表示负数: 正数的二进制 -1, 取反
参考