一、认识复杂度
一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。
时间复杂度是在一个算法流程中,常数操作量的一个指标。常用O(读作big O)来表示。
在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数。剩下的部分如果是f(N),那么时间复杂度就是O(f(N))。
简单来说,时间复杂度就是取最高项。
评价一个算法流程的好坏,先看时间复杂度,然后再分析不同数据样本下的实际运行时间。
二、位运算
计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算叫位运算。
1、“与” & :相当于生活中说的“并且”,就是两个条件都同时成立的情况下“与”的运算结果才为“真” 。
2、“或” | :相当于生活中的“或者”,当两个条件中有任一个条件满足,“或”的运算结果就为“真”。
3、”非“ ~ :就是指本来值的反。
4、“左移”:二进制位全部左移若干位,高位丢弃,低位补0。
5、“右移”:二进制位全部右移若干位,对无符号数,高位补0,有符号数,有的编译器补符号位,有的补0。
6、“异或” ^:异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。转化为命题,就是:“两者的值不同。”或“有且仅有一个为真。”
异或性质:
1)交换律 a ^ b = b ^ a
2)结合律 (a ^ b) ^ c = a ^ (b ^ c)
3)a ^ a = 0; a ^ 0 = a
4)a ^ b ^ b = a ^ 0=a
异或运用:
题目一:不用第三个变量,将两数交换。
解答:用异或的性质a ^ b ^ b = a ^ 0=a,可以完成。
代码实现:
public static void swap(Integer[] array, int i, int j) {
if(array != null && i < array.length && j