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