分解質因數題目

以sqrt(n) 爲時間複雜度的算法並很少見,最具表明性的就是分解質因數了。html

 

235. 分解質因數

 

中文

 

English

 

將一個整數分解爲若干質因數之乘積。python

 

樣例

樣例 1:算法

輸入:10
輸出:[2, 5]

樣例 2:markdown

輸入:660
輸出:[2, 2, 3, 5, 11]

 

注意事項

你須要從小到大排列質因子。app

class Solution:
    """
    @param num: An integer
    @return: an integer array
    """
    def primeFactorization(self, num):
        # write your code here
        result = []
        k = 2
        while k*k <= num:
            if num % k == 0:
                num = num//k
                result.append(k)
            else:
                k += 1
        if num > 1:
            result.append(num)
        return result

 

 

題目描述

http://www.lintcode.com/problem/prime-factorization/svg

具體步驟

  1. up=[n]up = [\sqrt{n}]up=[n
  1. ],做爲質因數k的上界, 初始化k=2k=2k=2。
  2. k<=upk <= upk<=up 且 n不爲1 時,執行步驟3,不然執行步驟4。
  3. 當n被k整除時,不斷整除並覆蓋n,同時結果中記錄k,直到n不能整出k爲止。以後k自增,執行步驟2。
  4. 當n不爲1時,把n也加入結果當中,算法結束。

幾點解釋

  • 不須要斷定k是否爲質數,若是k不爲質數,且能整出n時,n早被k的因數所除。故能整除n的k必是質數。
  • 爲什麼引入up?爲了優化性能。當k大於up時,k已不可能整除n,除非k是n自身。也即爲什麼步驟4判斷n是否爲1,n不爲1時必是比up大的質數。
  • 步驟2中,也斷定n是否爲1,這也是爲了性能,當n已爲1時,可早停。

代碼

Java:性能

public List<Integer> primeFactorization(int n) { List<Integer> result = new ArrayList<>(); int up = (int) Math.sqrt(n); for (int k = 2; k <= up && n > 1; ++k) { while (n % k == 0) { n /= k; result.add(k); } } if (n > 1) { result.add(n); } return result; } 

Python:優化

def primeFactorization(n): result = [] up = int(math.sqrt(n)); k = 2 while k <= up and n > 1: while n % k == 0: n //= k result.append(k) k += 1 if n > 1: result.append(n) return result 

C++:ui

vector<int> primeFactorization(int n) { vector<int> result; int up = (int)sqrt(n); for (int k = 2; k <= up && n > 1; ++k) { while (n % k == 0) { n /= k; result.push_back(k); } } if (n > 1) { result.push_back(n); } return result; } 

複雜度分析

  • 最壞時間複雜度 O(n)O(\sqrt{n})O(n
  • )。當n爲質數時,取到其最壞時間複雜度。
  • 空間複雜度 O(log(n))O(log(n))O(log(n)),當n質因數不少時,須要空間大,但總不會多於O(log(n))O(log(n))O(log(n))個。

延伸

質因數分解有一種更快的算法,叫作Pollard Rho快速因數分解。該算法時間複雜度爲O(n1/4)O(n^{1/4})O(n1/4),其理解起來稍有難度,有興趣的同窗能夠進行自學,參考連接spa

相關文章
相關標籤/搜索