左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算
我們常說,程序=算法+數據結構。結果光搞框架去了,有點說不過去~
時間復雜度
常數時間的操作:如果一個操作的執行時間不以具體樣本為轉移,每次執行時間都是固定時間。稱這樣的操作為常數時間操作。
數組的尋址操作就是固定時間操作,與數據量無關。
>>帶符號右移
>>>不帶符號右移
常數時間的操作包括:
非常數時間操作包括:
鏈表獲取i位置的元素
選擇排序
在0~n-1位置中找到最小值,和0位置的數交換
找1~n-1位置最小值,和1位置的數交換
…
直到n-1~n-1,不用操作了
整個流程中常數操作的數量:
我們最終是要將低階項和高階項的系數抹掉的。
注意
一個常用的小技巧
1、兩數相加除以2的時候,為了避免溢出,應該先除以2,再相加
2、右移一位>>比除以2的運算更快
3、除以2加1相當于先右移再進行或1| 1
必須保證兩個數在兩個獨立的空間,否則自己異或自己結果為0。這只是一個騷操作,面試的時候可能或問到,實際上你寫的時候不要這么得瑟,因為容易有坑。
問題1
如何在不使用新變量的情況下,交換兩個數?
異或運算和異或的順序無關
下面這道題,將所有的數全部異或即可
在eor中找最右側的1,這個最右側的1可以將a,b兩個數區分開。整個數組中,我們根據eor最右側1這個位置,將數組分為兩部分,其中一部分一定包含a,另一部分一定包含b。然后再分別對這兩部分進行整體的異或操作即可。
總結
以上是生活随笔為你收集整理的左神算法课笔记(一):时间复杂度、排序、对数器、二分法、异或运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络与IO知识扫盲(六):多路复用器
- 下一篇: 左神算法课笔记(二):链表、栈和队列、递