TIL(2022-11-11) 알고리즘 , 시간복잡도 공간복잡도 점근표기법

C one·2022년 11월 11일

/ 알고리즘 최빈값

def find_max_occurred_alphabet(string): # 최대빈도 알파벳 찾기위한 함수 정의 ( 파라미터 string )
    alphabet_occurrence_array = [0] * 26 # 26개의 0으로 채워진 빈 배열

    for char in string: # char를 반복한다 파라미터(맨아래 문자열)에
        if not char.isalpha(): # char가 알파벳이 아닌것이 참이라면
            continue # for문 다음 인덱스로 진행한다 ( 문자열에서 알파벳이 아닌것을 거름)
        arr_index = ord(char) - ord('a') # (char 아스키코드 - a의 아스키코드) 값을 알파벳 인덱스라 한다
        alphabet_occurrence_array[arr_index] += 1 # 빈 배열의 인덱스 번째에 1을더한다 , 이 과정을 반복한다

## range 함수는 연속적인 숫자 객체를 만들어서 반환해주는 함수입니다.
## 예를 들어,range(10)을 호출하면 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 가 들어있는 반복 가능한 객체를 알아서 만들어서 반환
    
    max_occurrence = 0 # 최대 빈도
    max_alphabet_index = 0 # 최대빈도 알파벳의 인덱스
    for index in range(len(alphabet_occurrence_array)): # index 를 반복한다 range(0,26)에서 
        alphabet_occurrence = alphabet_occurrence_array[index] # 알파벳 빈도값 = 알파벳 빈도 배열[인덱스값]
        if alphabet_occurrence > max_occurrence: # if 알파벳 빈도값이 최대 빈도값보다 크다면
            max_occurrence = alphabet_occurrence # 알파벳 빈도값이 최대빈도값이 된다
            max_alphabet_index = index #  그 인덱스 번호 또한 최대빈도 알파벳 인덱스값이 된다 , 이것을 반복

    return chr(max_alphabet_index + ord('a')) # (최대빈도알파벳 인덱스값 + a의 아스키코드를 더한값 = 최대빈도알파벳의 아스키코드)
                                              # chr() 함수 이용해 최대빈도알파벳의 아스키코드룰 실제 알파벳으로 변환

result = find_max_occurred_alphabet
print("정답 = a 현재 풀이 값 =", result("Hello my name is sparta"))
print("정답 = a 현재 풀이 값 =", result("Sparta coding club"))
print("정답 = s 현재 풀이 값 =", result("best of best sparta"))

/ 시간 복잡도

입력값과 문제해결 소요시간 간의 상관관계를 뜻한다
입력값의 증가에도 소요시간이 적게 증가하는 것이 좋은 알고리즘이다

입력값이란 함수에서 크기 길이가 변할수 있는 값이다
입력값의 길이를 N이라고 표현한다

ex) N은 6이고 시간복잡도가 N^2 + 33 일때 36+33이라 표현하는것이 아니라 N^2이라 표현한다

시간복잡도의 목적은 입력값과 소요시간간의 상관관계를 수식으로 표현하는것이기 때문이다

이렇게 수치로 확인하면, 얼마나 효율적인지 정량적으로 분석가능하다


/ 공간 복잡도

입력값과 문재해결에 사용되는 공간의 상관관계를 뜻함
저장하는 데이터의 양이 = 1개의 공간을 사용하는것으로 계산한다


/ 알고리즘의 성능의 영향도

시간복잡도가 훨씬 크다

따라서 공간 복잡도를 희생해서라도 시간 복잡도에 유리한 코드를 작성해야 한다


/ 점근 표기법

알고리즘의 효율성 평가하는 방법이다 < 시간 공간 복잡도도 점근표기법중 하나이다

점근표기법의 종류로는 빅 오 표기법 (Big - O) / 빅 오메가 표기법(Big - Ω)이 있다

빅 오 표기법, 성능이 최악이라 생각하고 어느정도의 연산량이 걸릴지
빅 오 메가기법, 성능이 최악이라 생각하고 어느정도의 연산량이 걸릴지

알고리즘은 입력값의 분포에 따라 성능이 달라지는데, 이를 고려햐여 거의 모든 알고리즘은
두 종류 중 (Big - O) 빅 오 표기법을 사용한다

왜냐하면 대부분의 입력값이 최선일 가능성은 적고, 최악의 경우를 대비하기 위해 빅오 표기법을 사용


profile
🌽

0개의 댓글