アルゴリズムベース


学習内容


SWAP


Pythonでのswap
  • # 첫번째 방법
    a = 3
    b = 1
    
    temp = a
    a = b
    b = temp
    
    print(a,b)
  • # 두번째 방법
    a = 3
    b = 1
    
    a, b = b, a # 파이썬에서는 한 줄로 변경가능
    
    print(a,b)
  • Search algorithm basic


  • せんけいたんさく
  • を一度に検索する方法
  • 時間複雑度:O(n)
  • def linear_search(linear_arr, search_number):
        for i in range(len(linear_arr)):
          if linear_arr[i] == search_number:
            return i
    
    linear_arr = [5,22,87,1,3]
    search_number = 1
    print("search index : ",linear_search(linear_arr, search_number))

  • バイナリサーチ
  • を繰り返すことで数字を半分に減らし、
  • を検索します.
  • は、ソートされた場合のみ
  • を実行する.
  • 時間複雑度:O(logn)
  • def binary_search(test_list, search_item):
    
         low = 0
         high = len(test_list) - 1
    
         while low <= high:
             middle = (low + high) // 2   # middle을 지정해서 검색속도를 빠르게 한다.
             guess = test_list[middle]
    
             if guess == search_item:
                 return middle
             if guess > search_item:
                 high = middle - 1
             else:
                 low = middle + 1
         return None

    Iterative Sorting


  • ソートの選択(ソートの選択)
  • 最小ノード
  • を選択
  • スイッチ
  • 前の2つのプロセス
  • を繰り返します.
  • 時間複雑度:O(n^2)
  • 不安定:冗長性がある場合、元の順序
  • を維持できません.
  • 実例:図書館図書整理
  • # 선택정렬 소스코드
    
    def selection_sort(items):
        
        for i in range(0, len(items) - 1):    # 외부 반복문(루프)
    
            cur_index = i
            smallest_index = cur_index
            
            for j in range(cur_index + 1, len(items)):  # 내부루프
                   # 최소값찾는 로직
                   if items[smallest_index] > items[j]:
                       smallest_index = j
    
            # swap
            items[smallest_index], items[cur_index] = items[cur_index], items[smallest_index]
     
        return items

  • ソートの挿入
  • 特定のノードと並べ替えられたノードとの比較
  • 特定のノード値より小さいノードが出現するまで、
  • を比較する
  • という小さな値のノードが見つかった場合、その右側のインデックスに特定のノード
  • が挿入される.
  • の並べ替えられていないノードから1つを選択し、前のステップ
  • を繰り返す.

    ソース:https://runestone.academy/runestone/books/published/pythonds/SortSearch/TheInsertionSort.html
  • 効率的なデータ並べ替えアルゴリズム
  • 時間複雑度:O(n^2)
  • # 삽입정렬 소스코드
    
    def ins_sort(unsort_list):
    
        loop_number = len(unsort_list)          # 반복횟수를 위한 길이설정
    
        # 앞쪽에 있는 노드들을 검색하기 위한 반복문
        for compare_index in range(loop_number):    # 비교하려는 위치부터 loop_number만큼 반복
            compare_value = unsort_list[compare_index]  
            prev_position = compare_index - 1   # 이전 노드값에 대한 인덱스를 가리킴
            
            # 비교연산 후 삽입을 진행하는 반복문
            while prev_position >= 0 and unsort_list[prev_position] > compare_value:    
                  # 1-1차작업 : swap을 위한 작업
                unsort_list[prev_position], unsort_list[compare_index] = unsort_list[compare_index], unsort_list[prev_position]
                prev_position = prev_position - 1
                 # 1-2차작업 : 비교된 더 큰 값을 (이전노드+1) 인덱스에 삽입
                compare_index = compare_index - 1
                
        return unsort_list
                
    test_arr = [5,3,1,6]
    ins_sort(test_arr)

  • Bubble sort(バブルソート)
    2つの隣接要素のサイズを
  • に基づいて比較し、繰り返し交換アルゴリズム
  • 最初のプロジェクトから最後のプロジェクトをペアで比較し、サイズ別に
  • を交換します.
  • 時間複雑度:O(n^2)
  • の隣接ノードのみが交換ため、信頼性の高い
  • .
     버블정렬 소스코드
    def bubble_sort(li):
        length = len(li) - 1
    
        for i in range(length):
            for j in range(length-i):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
    
             # 외부 반복문(아래 그림에서 전체 리스트에 대해 정렬이 완료되었는지 검사하고 패스해줌)
              # 내부 반복문(아래 그림에서 하나의 리스트의 개별 값을 비교하고 교체시킨다)
                # 현재 인덱스의 값과 다음 인덱스의 값 비교
                    # 비교한 것에 따라 정렬을 위한 인덱스 교환 작업
    
    li = [10, 2, 1, 7, 4, 3, 0]
    bubble_sort(li)
    print(li)