⑴ 递归,快速排序,D&C
递归是一种编程技术,其核心是两个关键要素:基线条件与递归条件。基线条件是递归的终止点,确保递归不会无限进行。递归条件则是递归函数调用自身,持续执行的过程,直至达到基线条件。递归的调用栈,类似程序在执行子函数时的临时存储空间,用于记录当前调用位置,便于函数返回后继续执行。
栈是一种数据结构,与数组和链表相似,遵循后进先出原则,如同贴便签。在递归调用中,栈用于管理函数的执行环境,确保每一步的调用和返回都能正确进行。
分而治之(D&C)是一种解决问题的高效策略,它将复杂问题分解为更小、更简单的子问题,并递归地解决这些子问题,最终将结果合并以得到完整解决方案。这一方法在算法设计中具有广泛应用。
以快速排序为例,这是一种基于分而治之的排序算法。快速排序的关键步骤包括识别数组的基准元素,分割数组以将小于基准的元素放在左侧,大于或等于基准的元素放在右侧,然后对这两部分递归应用相同的过程,直至数组有序。
快速排序的基线条件是数组为空或仅包含一个元素,此时无需排序。通过选择一个基准元素,数组被分割成两个子数组。不断递归地在这些子数组中应用相同排序过程,直到所有子数组都满足基线条件,排序完成。
为了直观理解快速排序的过程,可以使用可视化工具或绘制图像,展示数组分割和排序的动态过程。例如,初始数组为[33,10,15,7],基准选择为33。通过比较和交换,将数组分割为[10,15,7]和[]。接着,对子数组[10,15,7]中的10进行类似处理,最终数组变为有序状态。
编写快速排序算法的代码时,需要特别注意基准元素的选择、数组分割逻辑以及递归终止条件的实现,以确保算法的效率和正确性。
⑵ 数学次方快速计算方法
数学次方快速计算的方法有:
1. 快速幂算法:将指数n进行二进制拆分,然后通过不断平方和乘法的方式进行运算。例如,计算a^11时,可以将11拆分为1011(二进制),则a^11 = a^(2^3) * a^(2^1) * a^(2^0) = a^8 * a^2 *a^1。这样就可以通过3次乘法和3次平方运算得到a^11,大大提高了计算效率。
2. 矩阵快速幂算法:将底数a转化为一个矩阵,然后通过矩阵乘法的方式进行运算。例如,计算a^11时,可以将a转化为一个2*2的矩阵,然后通过矩阵乘法运算得到a^11对应的矩阵。这样就可以通过几次矩阵乘法得到结果,大大提高了计算效率。
3. 循环:对于一些简单的幂运算,我们可以用一个简单的循环来计算结果。我们将底数相乘n次。但这种方法对于较大的指数来说效率低下。
4. 递归:递归方法在实际中可能会导致栈溢出或者计算重复,但思路比较简单。我们可以将一个大问题化为两个相同的小问题,递归求解小问题。例如:fastPow(x, n) = x * fastPow(x, n / 2) 如果n是偶数;如果n是奇数:fastPow(x, n) = fastPow(x, n / 2) * fastPow(x, n / 2) * x。以上就是一些常见的次方快速计算方法。
⑶ 次方的快速算法
次方有两种快速算法:
第一种是直接用乘法计算,例:3⁴=3×3×3×3=81。
第二种则是用次方阶级下的数相乘,例:3⁴=9×9=81
次方最基本的定义是:设a为某数,n为正整数,a的n次方表示为aⁿ,表示n个a连乘所得之结果,如2⁴=2×2×2×2=16。次方的定义还可以扩展到0次方和负数次方等等。
负数次方
由5的0次方继续除以5就可以得出5的负数次方。
例如: 5的0次方是1 (任何非零数的0次方都等于1。)
5的-1次方是0.2 1÷ 5 =0.2
5的-2次方是0.04 0.2÷5 =0.04
因为5的-1次方是0.2 ,所以5的-2次方也可以表示为0.2×0.2=0.04
5的-3次方则是0.2×0.2×0.2=0.008
由此可见,一个非零数的-n次方=这个数的倒数的n次方。
(3)快速相关算法扩展阅读:
0的次方
0的任何正数次方都是0,例:0⁵=0×0×0×0×0=0
0的0次方无意义。
一个数的0次方
任何非零数的0次方都等于1。原因如下:
通常代表3次方
5的3次方是125,即5×5×5=125
5的2次方是25,即5×5=25
5的1次方是5,即5×1=5
由此可见,n≧0时,将5的(n+1)次方变为5的n次方需除以一个5,所以可定义5的0次方为:
5 ÷ 5 = 1。
⑷ 澶у﹀叚绉岖▼搴忓憳瀹炵敤绠楁硶鎺ㄨ崘
绋嫔簭锻桦疄鐢ㄧ畻娉曟湁鐢ㄦ帹钻
绠楁硶涓: 蹇阃熸帓搴忕畻娉
蹇阃熸帓搴忔槸鐢变笢灏悸烽湇灏旀墍鍙戝𪾢镄勪竴绉嶆帓搴忕畻娉曘傚湪骞冲潎鐘跺喌涓嬶纴鎺掑簭 n 涓椤圭洰瑕丱(nlog n)娆℃瘆杈冦傚湪链鍧忕姸鍐典笅鍒欓渶瑕丱(n2)娆℃瘆杈冿纴浣呜繖绉岖姸鍐靛苟涓嶅父瑙併备簨瀹炰笂锛屽揩阃熸帓搴忛氩父鏄庢樉姣斿叾浠朞(n log n) 绠楁硶镟村揩锛屽洜涓哄畠镄勫唴閮ㄥ惊鐜 (inner loop)鍙浠ュ湪澶ч儴鍒嗙殑鏋舵瀯涓婂緢链夋晥鐜囧湴琚瀹炵幇鍑烘潵銆
蹇阃熸帓搴忎娇鐢ㄥ垎娌绘硶绛栫暐𨱒ユ妸涓涓涓茶(list)鍒嗕负涓や釜瀛愪覆琛(sub-lists)銆
绠楁硶浜: 鍫嗘帓搴忕畻娉
鍫嗘帓搴(Heapsort)鏄鎸囧埄鐢ㄥ爢杩欑嶆暟鎹缁撴瀯镓璁捐$殑涓绉嶆帓搴忕畻娉曘傚爢绉鏄涓涓杩戜技瀹屽叏浜屽弶镙戠殑缁撴瀯锛屽苟钖屾椂婊¤冻鍫嗙Н镄勬ц川:鍗冲瓙缁撶偣镄勯敭鍊兼垨绱㈠紩镐绘槸灏忎簬(鎴栬呭ぇ浜)瀹幂殑鐖惰妭镣广
鍫嗘帓搴忕殑骞冲潎镞堕棿澶嶆潅搴︿负O(nlogn)
绠楁硶涓: 褰掑苟鎺掑簭
褰掑苟鎺掑簭(Merge sort锛屽彴婀捐疟浣:钖埚苟鎺掑簭)鏄寤虹珛鍦ㄥ綊婢′綔涓婄殑涓绉嶆湁鏁堢殑鎺掑簭绠楁硶銆傝ョ畻娉曟槸閲囩敤鍒嗘不娉(Divide andConquer)镄勪竴涓闱炲父鍏稿瀷镄勫簲鐢ㄣ
绠楁硶锲:浜屽垎镆ユ垒绠楁硶
浜屽垎镆ユ垒绠楁硶鏄涓绉嶅湪链夊簭鏁扮粍涓镆ユ垒镆愪竴鐗瑰畾鍏幂礌镄勬悳绱㈢畻娉曘傛悳绱犺繃绋嬩粠鏁扮粍镄勪腑闂村厓绱犲紑濮嬶纴濡傛灉涓闂村厓绱犳eソ鏄瑕佹煡镓剧殑鍏幂礌锛屽垯鎼灭礌杩囩▼缁撴潫:濡傛灉镆愪竴鐗 瀹氩厓绱犲ぇ骞叉垨钥呭皬骞蹭腑闂村厓绱狅纴鍒椤湪鏁扮粍澶т簬鎴栧皬骞蹭腑闂村厓绱犵殑闾d竴鍗娄腑镆ユ垒锛岃屼笖璺熷紑濮嬩竴镙蜂粠涓闂村厓绱犲紑濮嬫瘆杈冦傚傛灉鍦ㄦ煇涓姝ラゆ暟缁勪负绌猴纴鍒欎唬琛ㄦ垒涓嶅埌銆傝繖 绉嶆悳绱㈢畻娉曟疮涓娆℃瘆杈冮兘浣挎悳绱㈣寖锲寸缉灏忎竴鍗娿傛姌鍗婃悳绱㈡疮娆℃妸鎼灭储鍖哄烟鍑忓皯涓鍗婏纴镞堕棿澶嶆潅搴︿负O(logn) 銆
绠楁硶浜: BFPRT(绾挎ф煡镓剧畻娉)
BFPRT绠楁硶瑙e喅镄勯梾棰桦崄鍒嗙粡鍏革纴鍗充粠镆恘涓鍏幂礌镄勫簭鍒椾腑阃夊嚭绗琸澶(绗琸灏)镄勫厓绱狅纴阃氲繃宸у欑殑鍒嗘瀽锛孊FPRT鍙浠ヤ缭璇佸湪链鍧忔儏鍐典笅浠崭负绾挎ф椂闂村嶆潅搴︺傝ョ畻 娉旷殑镐濇兂涓庡揩阃熸帓搴忔濇兂鐩镐技锛屽綋铹讹纴涓轰娇寰楃畻娉曞湪链鍧忔儏鍐典笅锛屼緷铹惰兘杈惧埌o(n)镄勬椂闂村嶆潅搴︼纴浜斾綅绠楁硶浣滆呭仛浜嗙簿濡欑殑澶勭悊銆
绠楁硶鍏: BFS(骞垮害浼桦厛鎼灭储)
骞垮害浼桦厛鎼灭储绠楁硶(Breadth-First-Search)锛屾槸涓绉嶅浘褰㈡悳绱㈢畻娉曘傜亩鍗旷殑璇碆FS鏄浠庢牴鑺傜偣寮濮嬶纴娲荤潃镙(锲)镄勫藉害阆嶅巻镙(锲)镄勮妭镣广傚傛灉镓链夎妭镣瑰潎琚璁块梾锛屽垯绠楁硶涓姝銆侭FS钖屾牱灞炰簬鐩茬洰鎼灭储銆备竴鑸鐢ㄩ槦鍒楁暟鎹缁撴瀯𨱒ヨ緟锷╁疄鐜痫FS绠楁硶銆