時間の複雑さ


アルゴリズムテストを行うと、時間の複雑さを低減する要求に直面します.
時間の複雑さという言葉自体がこの概念をさらに難しくしているようだ.
アルゴリズムの時間的複雑さは,アルゴリズム,すなわちある問題を解決するプログラムの実行速度の数値を客観的に反映するだけである.
時間複雑度という言葉の語感に気づかなかったが,時間複雑度は反復文によって決まる.
つまり,これはどのようにして重複回収を減らすかという問題である.
アルゴリズムで以下の問題を考えると、
출근하는 과정
1. 세면세족
2. 환복
3. 지하철역으로 이동
4. 지옥철 탑승 (1시간 이동)
5. 지옥철 하차
6. 사무실 입성
4回地下鉄に乗る時間が通勤時間の大部分を占めるため、地下鉄に乗る時間を減らせば、通勤時間の問題を効果的に管理することができる.
プログラム設計におけるアルゴリズムの時間的複雑さを解決する方法も,前の例とあまり変わらない.

アルゴリズムパフォーマンスタグ


アルゴリズムの時間的複雑さを表す際にbigoマーキング法を用いた.Big Oマーキング法は、O(1)O(logN)O(N)O(nlogN)O(N^2)O(2^N)O(N!)と表現される.
  • 最大2回(定数回):O(1)
  • if n > 10: # n이 1일 경우, 10과 n을 비교하는 조건문을 실행
      print(n) # 조건문에 만족하면 print 함수를 실행
  • n,n回,n+10回,または3 n+10回,実行:O(n)
  • .
    variable = 1 # 변수 할당에 1회 실행
    for num in range(3): # 안쪽 반복문을 3회 반복 실행
      for index in range(n): # n번 반복 실행
        print(index) # 반복문 당 1회씩 실행
  • nに従って、n 2 n^2 n 2回、n 2 n^2 n 2+1000回、100 n 2 n^2 n−100、または300 n 2 n^2 n 2+1回等を実行する:O(n 2 n^2 n 2)
  • variable = 1 # 변수 할당에 1회 실행
    for i in range(300): # 안쪽 반복문을 300번 반복 실행
      for num in range(n): # 안쪽 반복문을 n번 반복 실행
        for index in range(n): # n번 반복 실행
          print(index) # 반복문 당 1회씩 실행

    時間複雑度アルゴリズム


    学生時代の数学の授業の記憶を思い出して、1からnを求める公式があります.
    これをプログラミングして実装すると、次の機能が実現されます.
    def sum(n):
      total = 0
      for num in range(1, n + 1):
        total += num
        return total
        
    sum(100) # 5050
    このようにして実現される1〜nの総和を求める関数の時間的複雑さを計算すると、文がn回繰り返されるため、O(N)が得られる.
    この関数の時間的複雑さを減らすことができますか?数学の授業で習った公式を考えればいい.
    この問題において,対応する数学式は,この問題の時間的複雑さを効果的に管理できるアルゴリズムである.
    式はn次項にn+1次項を乗じた値を2で割る.n(n+1) / 2
    def sum(n):
      return int(n * (n + 1) / 2)
      
    sum(100) #5050
    以前に記述されたコードの時間的複雑度はO(N)であったが,数学式を適用したsum関数の時間的複雑度はO(1)であった.
    このようにアルゴリズムの時間的複雑さを低減することはプログラム性能を向上させる方法の一つであるため,学習過程を後で遅らせるべきではない.