时间复杂度
-
常数复杂度:
- 从数组中取出一个数,因为只要基地址加偏移量就好了
- 加,减,乘,除,比较都是常数操作
- 链表中取出一个数不是常数操作,因为物理地址是乱的,只能从左到右一个个遍历
-
选择排序中的常数操作
- 取数(看)
- 比较
- 交换
-
时间复杂度近似的时候,就通过常数项来比较
- 但是常数项是估计的,还是要通过实验的方式比较哪一种算法更快、
- 也就是所谓的常数项时间
-
额外空间复杂度
- 如果只要几个变量,额外空间就是O(1)
- 如果需要另外一个数组,规模与数据量近似,额外空间就是O(N)
- 交换排序的额外空间复杂度就是O(1)
-
冒泡排序
- 有序的地方在右侧,最大
- 在0~N的无序上作,在0 - N-1上作,在0 - N-2上作。。。
-
选择排序
- 每一轮挑出最小放在左侧
- 在0 - N 的无序上做,在1 - N上做,在2 - N上做。。。
-
异或运算可以理解为无进位的相加
-
0 ^ N = N
-
N ^ N = 0
-
异或运算满足交换性和结合性
-
同样一批数异或后的结果与运算顺序无关
-
不用额外变量的交换写法
-
a = a ^ b
-
b = a ^ b
-
a = b ^ a
-
前提是a 和 b在内存里是独立的区域,可以是一样的值,如果是同一个区域会出问题
-
在数组中作,就要保证不是同一个下标做交换,否则这个位置就会变成0
-
一般来说不用这样写,面试中会出现异或知识点
-
提取出一个数最右侧的一个1: x = n & (~n+1)
-
-