스닥
Playground
스닥
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • 개발자 기본기 (1)
    • Swift 아키텍처 (6)
    • iOS 개발 (55)
      • Swift (12)
      • UIKit (17)
      • SwiftUI (9)
      • CoreData (9)
      • MusicKit (4)
      • WebKit (2)
      • 개발 환경 (0)
      • WatchOS (2)
    • 애플 개발자 아카데미 (4)
    • 막 쓰는 개발일지 (0)
    • 운영체제 (4)
    • 네트워크, 서버 (16)
      • Network (9)
      • Server (7)
    • 알고리즘 (8)
    • C언어 (7)
      • 함수 (7)
    • 하루 이야기 (23)

블로그 메뉴

  • GitHub계정
  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SWIFT
  • 문자열 복사
  • 서버
  • 자료구조
  • 트리
  • ip주소
  • 알고리즘
  • docker
  • 깊이 우선
  • core data
  • ios rendering
  • dfs
  • struct class 성능
  • 너비 우선
  • swift performance
  • C 언어
  • BFS
  • 도커
  • Core Animation
  • Server

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
스닥

Playground

알고리즘

[알고리즘] P, NP

2021. 6. 15. 10:55

P와 NP는 "문제"를 구분하는 기준이다.

 

어떤 문제가 Polynomial Time Algorithm이 존재하면 그 문제는 P인 것이고,

어떤 문제를 해결할 때 Non-Deterministic Polynomial Time Algorithm이 존재하면 그 문제는 NP인 것이다.

 

쉽게 말하면 어떤 문제가 다항시간 안에 결정론적 튜링머신으로 답을 찾을 수 있는지 비 결정론적 튜링머신으로 답을 찾을 수 있는지를 구분한 것이다.

 

결정론적 튜링머신 - 정해진 명령을 수행하는 가상의 기계비결정론적 튜링 머신 - 특정 상태에서 움직일 수 있는 상태의 개수가 하나로 정해져 있지 않은 경우, 즉 입력 값이 주어진 문제의 해답인지를 검사하는 장치이다.

 

**"시간"으로 구분한 것이다 아니다. P NP 모두 다항시간에서 판단이 된다!! **

 

 

 

polynomial time Algorithm(다항 시간 알고리즘)이란?

 

최악의 수행 시간이 O(N^K)의 시간복잡도를 가지는 알고리즘 (k는 상수)

우리가 지금까지 배우고 풀어본 대부분의 문제들은 이에 속한다. (정렬문제, 최대공약수 문제, 소수 판별 문제 등등)

지금까진 우리는 어떤 알고리즘이 O(N^10)의 시간복잡도를 가지고 있으면 엄청나게 느린 것으로 생각했다. 하지만 적어도 이는 그게 10년이 걸리던 20년이 걸리던 우리가 예상할 수 있는 시간 안에 풀린다. (최악의 시간복잡도를 알고 있기 때문에)

 

 

 

Non-Deterministic Polynomial Time Algorithm (비 결정적 다항시간 알고리즘) 이란?

 

어떤 문제를 풀기 위한 알고리즘이 input 값이 같아도 알고리즘을 시행할 때 마다 다른 output을 내지만,  문제에 대한 답에 대한 검증이 다항 시간 안에 이뤄질 수 있는 문제를 뜻한다.

즉, 결정론적 튜링머신으로는 다항 시간 내에 풀어낼 수 없는 문제들을 NP 문제라고 한다.

 

 

 

여기서 P에 속하는 문제들은 당연히 그 답은 그 답에 대한 검증도 다항시간 안에 이루어진다.

그렇기 때문에 P는 NP의 부분집합이다.

 

 

 

'알고리즘' 카테고리의 다른 글

[알고리즘] MST 알고리즘 (1) - 그래프 분할 (cut property)  (0) 2021.06.14
[알고리즘] LSD vs MSD in Radix sort (기수 정렬) / C++ 구현  (0) 2021.06.12
[알고리즘] 계수 정렬 (key-indexed counting sort) / C++ 구현  (0) 2021.06.12
[알고리즘] DFS (Depth-First Search) / C++ 구현  (0) 2021.06.10
[알고리즘] BFS ( Breadth-First Search) / C++ 구현  (0) 2021.06.10
[자료구조 ] Tree(트리) 필수 개념, 트리 순회  (0) 2021.05.22
[알고리즘] Run-Length Encoding (런-렝스 부호화) 쉽게 이해하기  (0) 2021.05.19
    스닥
    스닥
    https://github.com/feldblume5263

    티스토리툴바