검색 알고리즘
컴퓨터 과학에서 검색 알고리즘(search algorithm)은 검색 문제를 해결하도록 설계된 알고리즘이다. 검색 알고리즘은 특정 자료 구조 내에 저장되거나 문제 영역의 탐색 공간에서 이산 또는 연속 값으로 계산된 정보를 검색하는 역할을 한다.
검색 엔진은 검색 알고리즘을 사용하지만, 이는 정보 검색 연구에 속하며 알고리즘학에는 속하지 않는다.
사용할 적절한 검색 알고리즘은 검색되는 자료 구조에 따라 달라지는 경우가 많으며, 데이터에 대한 사전 지식을 포함할 수도 있다. 검색 알고리즘은 탐색 트리, 연관 배열, 데이터베이스 인덱스와 같이 특별히 구성된 데이터베이스 구조를 통해 더 빠르거나 효율적으로 만들 수 있다.[1][2]
검색 알고리즘은 검색 메커니즘에 따라 선형, 이진, 해싱의 세 가지 유형으로 분류할 수 있다. 선형 검색 알고리즘은 선형 방식으로 모든 레코드에서 대상 키와 관련된 레코드를 확인한다.[3] 이진 검색 또는 절반 구간 검색은 검색 구조의 중심을 반복적으로 대상으로 삼아 검색 공간을 절반으로 나눈다. 비교 검색 알고리즘은 키를 비교하여 대상 레코드를 찾을 때까지 레코드를 연속적으로 제거하여 선형 검색을 개선하며, 정의된 순서가 있는 자료 구조에 적용할 수 있다.[4] 디지털 검색 알고리즘은 숫자 키를 사용하여 자료 구조의 숫자 속성을 기반으로 작동한다.[5] 마지막으로 해싱은 해시 함수를 기반으로 키를 레코드에 직접 매핑한다.[6]
알고리즘은 종종 계산 복잡도 또는 최대 이론적 실행 시간으로 평가된다. 예를 들어, 이진 검색 함수는 최대 O(log n) 또는 로그 시간의 복잡도를 갖는다. 간단히 말해, 검색 대상을 찾는 데 필요한 최대 연산 횟수는 검색 공간 크기의 로그 함수이다.
검색 알고리즘의 응용
검색 알고리즘의 특정 응용 분야는 다음과 같다.
- 조합 최적화의 문제:
- 제약 충족 문제의 문제:
- 게임 이론, 특히 조합론적 게임 이론에서 다음으로 수행할 최적의 움직임을 선택하는 것 (최소극대화 알고리즘과 같은)
- 전체 가능성 집합에서 조합 또는 암호 찾기
- 정수 인수분해 (암호학의 중요한 문제)
- 웹 크롤러를 위한 검색 엔진 최적화(SEO) 및 콘텐츠 최적화
- 온도, 압력 및 pH와 같은 공정 매개변수를 변경하여 화학 반응과 같은 산업 공정 최적화
- 데이터베이스에서 레코드 검색
- 리스트 또는 배열에서 최대 또는 최소 값 찾기
- 주어진 값이 값 집합에 있는지 확인
분류
가상 검색 공간
가상 공간을 검색하는 알고리즘은 제약 충족 문제에 사용되며, 목표는 특정 수학적 방정식 및 부등식/등식을 충족할 특정 변수에 대한 값 할당 집합을 찾는 것이다. 또한 목표가 해당 변수의 특정 함수를 최대화 또는 최소화할 변수 할당을 찾는 경우에도 사용된다. 이러한 문제에 대한 알고리즘에는 기본적인 무차별 대입 검색 (또는 "순진한" 또는 "정보 없는" 검색)과 선형 완화, 제약 생성 및 제약 전파와 같이 이 공간의 구조에 대한 부분적인 지식을 활용하려는 다양한 휴리스틱이 포함된다.
중요한 하위 클래스는 지역 탐색 방법으로, 검색 공간의 요소를 그래프의 정점으로 보고, 해당 경우에 적용할 수 있는 휴리스틱 집합으로 정의된 가장자리로 이동하여 공간을 스캔한다. 예를 들어, 가장 가파른 하강 또는 최상 우선 기준에 따라 또는 확률적 검색에서 가장자리를 따라 항목 간에 이동한다. 이 범주에는 담금질 기법, 타부 탐색법, A-팀즈,[7] 유전 프로그래밍과 같이 임의의 휴리스틱을 특정 방식으로 결합하는 다양한 일반 메타휴리스틱 방법이 포함된다. 지역 검색의 반대는 전역 검색 방법이다. 이 방법은 검색 공간이 제한되지 않고 주어진 네트워크의 모든 측면이 검색 알고리즘을 실행하는 엔티티에 사용할 수 있을 때 적용할 수 있다.[8]
이 클래스에는 또한 요소를 트리의 정점으로 보고 특정 순서로 해당 트리를 탐색하는 다양한 트리 검색 알고리즘이 포함된다. 후자의 예로는 깊이 우선 탐색 및 너비 우선 탐색과 같은 철저한 방법과 퇴각검색 및 분기 한정법과 같은 다양한 휴리스틱 기반 탐색 트리 가지치기 방법이 있다. 최선을 다해서만 확률적으로 작동하는 일반적인 메타휴리스틱과 달리, 이러한 많은 트리 검색 방법은 충분한 시간이 주어지면 정확하거나 최적의 해를 찾는 것이 보장된다. 이를 "완전성"이라고 한다.
또 다른 중요한 하위 클래스는 체스 또는 백개먼과 같은 여러 플레이어 게임의 게임 트리를 탐색하는 알고리즘으로 구성되며, 노드는 현재 상황에서 발생할 수 있는 모든 가능한 게임 상황으로 구성된다. 이러한 문제의 목표는 상대방의 모든 가능한 움직임을 고려하여 승리할 최상의 기회를 제공하는 움직임을 찾는 것이다. 이와 유사한 문제는 로봇 안내 또는 마케팅, 금융, 군사 전략 계획과 같이 인간 또는 기계가 결과가 완전히 통제할 수 없는 연속적인 결정을 내려야 할 때 발생한다. 이러한 종류의 문제인 조합 검색은 인공지능의 맥락에서 광범위하게 연구되어 왔다. 이 클래스의 알고리즘 예로는 최소극대화 알고리즘, 알파-베타 가지치기, A* 알고리즘 및 그 변형이 있다.
주어진 구조의 하위 구조
중요하고 광범위하게 연구된 하위 클래스는 주어진 그래프에서 특정 하위 구조(예: 하위 그래프, 경로, 회로 등)를 찾는 그래프 알고리즘, 특히 그래프 순회 알고리즘이다. 예로는 데이크스트라 알고리즘, 크러스컬 알고리즘, 최근접 이웃 알고리즘, 프림 알고리즘이 있다.
이 범주의 또 다른 중요한 하위 클래스는 문자열 검색 알고리즘으로, 문자열 내에서 패턴을 검색한다. 두 가지 유명한 예는 보이어-무어 및 커누스-모리스-프랫 알고리즘과 접미사 트리 자료 구조를 기반으로 하는 여러 알고리즘이다.
함수의 최댓값 검색
1953년, 미국 통계학자 잭 키퍼는 단봉 함수의 최댓값을 찾는 데 사용할 수 있으며 컴퓨터 과학에서 많은 다른 응용 분야를 가진 피보나치 탐색을 고안했다.
양자 컴퓨터
양자 컴퓨터용으로 설계된 검색 방법도 있다. 예를 들어 그로버 알고리즘은 자료 구조나 휴리스틱의 도움 없이도 선형 또는 무차별 대입 검색보다 이론적으로 빠르다. 양자 컴퓨터의 아이디어와 응용은 아직 완전히 이론적이지만, 그로버의 알고리즘과 같은 알고리즘을 사용하여 양자 컴퓨팅 시스템의 가상 물리적 버전을 정확하게 복제하는 연구가 진행되었다.[9]
같이 보기
- 후진 귀납법
- 내용 주소화 기억장치 하드웨어
- 선형 검색 문제
- 검색 및 최적화에서 공짜 점심은 없다
- 추천 시스템, 매우 큰 데이터 세트에서 결과를 순위 매기는 통계적 방법도 사용한다.
- 검색 엔진 (컴퓨팅)
- 탐색 게임
- 선택 알고리즘
- 정렬 알고리즘, 특정 검색 알고리즘을 실행하는 데 필요하다.
- 웹 검색 엔진
분류:
각주
인용
- ↑ Beame & Fich 2002, 39쪽.
- ↑ Knuth 1998, §6.5 ("Retrieval on Secondary Keys").
- ↑ Knuth 1900, §6.1 ("Sequential Searching").
- ↑ Knuth 1998, §6.2 ("Searching by Comparison of Keys").
- ↑ Knuth 1998, §6.3 (Digital Searching).
- ↑ Knuth 1998, §6.4, (Hashing).
- ↑ Talukdar, Sarosh; Baerentzen, Lars; Gove, Andrew; De Souza, Pedro (1998년 12월 1일). 《Asynchronous Teams: Cooperation Schemes for Autonomous Agents》 (영어). 《Journal of Heuristics》 4. 295–321쪽. doi:10.1023/A:1009669824615. ISSN 1572-9397.
- ↑ Hunter, A.H.; Pippenger, Nicholas (2013년 7월 4일). 《Local versus global search in channel graphs》. 《Networks: An International Journey》. arXiv:1004.2526.
- ↑ López, G V; Gorin, T; Lara, L (2008년 2월 26일). 《Simulation of Grover's quantum search algorithm in an Ising-nuclear-spin-chain quantum computer with first- and second-nearest-neighbour couplings》. 《Journal of Physics B: Atomic, Molecular and Optical Physics》 41. arXiv:0710.3196. Bibcode:2008JPhB...41e5504L. doi:10.1088/0953-4075/41/5/055504. S2CID 18796310.
참고 문헌
서적
- Knuth, Donald (1998). 《Sorting and Searching》 2판. The Art of Computer Programming 3. Reading, MA: Addison-Wesley Professional.
기사
- Beame, Paul; Fich, Faith (August 2002). 《Optimal Bounds for the Predecessor Problem and Related Problems》. 《Journal of Computer and System Sciences》 65. 38–72쪽. doi:10.1006/jcss.2002.1822. S2CID 1991980.
- Schmittou, Thomas; Schmittou, Faith E. (2002년 8월 1일). 《Optimal Bounds for the Predecessor Problem and Related Problems》. 《Journal of Computer and System Sciences》 65. 38–72쪽. doi:10.1006/jcss.2002.1822.
외부 링크
- 위키배움터의 Uninformed Search Project.
- Harv 및 Sfn에 대상이 없는 오류가 있는 문서
- CS1 - 영어 인용 (en)
- 인용 오류 - 지원되지 않는 변수 무시됨
- 잘못된 파일 링크가 포함된 문서
- 존재하지 않는 문서를 대상으로 하는 hatnote 틀을 사용하는 문서
- 위키데이터 속성 P18을 사용하는 문서
- 위키데이터 속성 P41을 사용하는 문서
- 위키데이터 속성 P94를 사용하는 문서
- 위키데이터 속성 P117을 사용하는 문서
- 위키데이터 속성 P154를 사용하는 문서
- 위키데이터 속성 P213을 사용하는 문서
- 위키데이터 속성 P227을 사용하는 문서
- 위키데이터 속성 P242를 사용하는 문서
- 위키데이터 속성 P244를 사용하는 문서
- 위키데이터 속성 P245를 사용하는 문서
- 위키데이터 속성 P268을 사용하는 문서
- 위키데이터 속성 P269를 사용하는 문서
- 위키데이터 속성 P271을 사용하는 문서
- 위키데이터 속성 P347을 사용하는 문서
- 위키데이터 속성 P349를 사용하는 문서
- 위키데이터 속성 P350을 사용하는 문서
- 위키데이터 속성 P373을 사용하는 문서
- 위키데이터 속성 P380을 사용하는 문서
- 위키데이터 속성 P396을 사용하는 문서
- 위키데이터 속성 P409를 사용하는 문서
- 위키데이터 속성 P428을 사용하는 문서
- 위키데이터 속성 P434를 사용하는 문서
- 위키데이터 속성 P435를 사용하는 문서
- 위키데이터 속성 P436을 사용하는 문서
- 위키데이터 속성 P454를 사용하는 문서
- 위키데이터 속성 P496을 사용하는 문서
- 위키데이터 속성 P549를 사용하는 문서
- 위키데이터 속성 P650을 사용하는 문서
- 위키데이터 속성 P651을 사용하는 문서
- 위키데이터 속성 P691을 사용하는 문서
- 위키데이터 속성 P716을 사용하는 문서
- 위키데이터 속성 P781을 사용하는 문서
- 위키데이터 속성 P791을 사용하는 문서
- 위키데이터 속성 P864를 사용하는 문서
- 위키데이터 속성 P865를 사용하는 문서
- 위키데이터 속성 P886을 사용하는 문서
- 위키데이터 속성 P902를 사용하는 문서
- 위키데이터 속성 P906을 사용하는 문서
- 위키데이터 속성 P947을 사용하는 문서
- 위키데이터 속성 P950을 사용하는 문서
- 위키데이터 속성 P966을 사용하는 문서
- 위키데이터 속성 P982를 사용하는 문서
- 위키데이터 속성 P1003을 사용하는 문서
- 위키데이터 속성 P1004를 사용하는 문서
- 위키데이터 속성 P1005를 사용하는 문서
- 위키데이터 속성 P1006을 사용하는 문서
- 위키데이터 속성 P1015를 사용하는 문서
- 위키데이터 속성 P1045를 사용하는 문서
- 위키데이터 속성 P1048을 사용하는 문서
- 위키데이터 속성 P1053을 사용하는 문서
- 위키데이터 속성 P1146을 사용하는 문서
- 위키데이터 속성 P1153을 사용하는 문서
- 위키데이터 속성 P1157을 사용하는 문서
- 위키데이터 속성 P1186을 사용하는 문서
- 위키데이터 속성 P1225를 사용하는 문서
- 위키데이터 속성 P1248을 사용하는 문서
- 위키데이터 속성 P1273을 사용하는 문서
- 위키데이터 속성 P1315를 사용하는 문서
- 위키데이터 속성 P1323을 사용하는 문서
- 위키데이터 속성 P1330을 사용하는 문서
- 위키데이터 속성 P1362를 사용하는 문서
- 위키데이터 속성 P1368을 사용하는 문서
- 위키데이터 속성 P1375를 사용하는 문서
- 위키데이터 속성 P1407을 사용하는 문서
- 위키데이터 속성 P1556을 사용하는 문서
- 위키데이터 속성 P1584를 사용하는 문서
- 위키데이터 속성 P1695를 사용하는 문서
- 위키데이터 속성 P1707을 사용하는 문서
- 위키데이터 속성 P1736을 사용하는 문서
- 위키데이터 속성 P1886을 사용하는 문서
- 위키데이터 속성 P1890을 사용하는 문서
- 위키데이터 속성 P1907을 사용하는 문서
- 위키데이터 속성 P1908을 사용하는 문서
- 위키데이터 속성 P1960을 사용하는 문서
- 위키데이터 속성 P1986을 사용하는 문서
- 위키데이터 속성 P2041을 사용하는 문서
- 위키데이터 속성 P2163을 사용하는 문서
- 위키데이터 속성 P2174를 사용하는 문서
- 위키데이터 속성 P2268을 사용하는 문서
- 위키데이터 속성 P2349를 사용하는 문서
- 위키데이터 속성 P2418을 사용하는 문서
- 위키데이터 속성 P2456을 사용하는 문서
- 위키데이터 속성 P2484를 사용하는 문서
- 위키데이터 속성 P2558을 사용하는 문서
- 위키데이터 속성 P2750을 사용하는 문서
- 위키데이터 속성 P2980을 사용하는 문서
- 위키데이터 속성 P3223을 사용하는 문서
- 위키데이터 속성 P3233을 사용하는 문서
- 위키데이터 속성 P3348을 사용하는 문서
- 위키데이터 속성 P3372를 사용하는 문서
- 위키데이터 속성 P3407을 사용하는 문서
- 위키데이터 속성 P3430을 사용하는 문서
- 위키데이터 속성 P3544를 사용하는 문서
- 위키데이터 속성 P3562를 사용하는 문서
- 위키데이터 속성 P3563을 사용하는 문서
- 위키데이터 속성 P3601을 사용하는 문서
- 위키데이터 속성 P3723을 사용하는 문서
- 위키데이터 속성 P3788을 사용하는 문서
- 위키데이터 속성 P3829를 사용하는 문서
- 위키데이터 속성 P3863을 사용하는 문서
- 위키데이터 속성 P3920을 사용하는 문서
- 위키데이터 속성 P3993을 사용하는 문서
- 위키데이터 속성 P4038을 사용하는 문서
- 위키데이터 속성 P4055를 사용하는 문서
- 위키데이터 속성 P4114를 사용하는 문서
- 위키데이터 속성 P4143을 사용하는 문서
- 위키데이터 속성 P4186을 사용하는 문서
- 위키데이터 속성 P4423을 사용하는 문서
- 위키데이터 속성 P4457을 사용하는 문서
- 위키데이터 속성 P4534를 사용하는 문서
- 위키데이터 속성 P4535를 사용하는 문서
- 위키데이터 속성 P4581을 사용하는 문서
- 위키데이터 속성 P4613을 사용하는 문서
- 위키데이터 속성 P4955를 사용하는 문서
- 위키데이터 속성 P5034를 사용하는 문서
- 위키데이터 속성 P5226을 사용하는 문서
- 위키데이터 속성 P5288을 사용하는 문서
- 위키데이터 속성 P5302를 사용하는 문서
- 위키데이터 속성 P5321을 사용하는 문서
- 위키데이터 속성 P5368을 사용하는 문서
- 위키데이터 속성 P5504를 사용하는 문서
- 위키데이터 속성 P5587을 사용하는 문서
- 위키데이터 속성 P5736을 사용하는 문서
- 위키데이터 속성 P5818을 사용하는 문서
- 위키데이터 속성 P6213을 사용하는 문서
- 위키데이터 속성 P6734를 사용하는 문서
- 위키데이터 속성 P6792를 사용하는 문서
- 위키데이터 속성 P6804를 사용하는 문서
- 위키데이터 속성 P6829를 사용하는 문서
- 위키데이터 속성 P7293을 사용하는 문서
- 위키데이터 속성 P7303을 사용하는 문서
- 위키데이터 속성 P7314를 사용하는 문서
- 위키데이터 속성 P7902를 사용하는 문서
- 위키데이터 속성 P8034를 사용하는 문서
- 위키데이터 속성 P8189를 사용하는 문서
- 위키데이터 속성 P8381을 사용하는 문서
- 위키데이터 속성 P8671을 사용하는 문서
- 위키데이터 속성 P8980을 사용하는 문서
- 위키데이터 속성 P9070을 사용하는 문서
- 위키데이터 속성 P9692를 사용하는 문서
- 위키데이터 속성 P9725를 사용하는 문서
- 위키데이터 속성 P9984를 사용하는 문서
- 위키데이터 속성 P10020을 사용하는 문서
- 위키데이터 속성 P10299를 사용하는 문서
- 위키데이터 속성 P10608을 사용하는 문서
- 위키데이터 속성 P10832를 사용하는 문서
- 위키데이터 속성 P11249를 사용하는 문서
- 위키데이터 속성 P11646을 사용하는 문서
- 위키데이터 속성 P11729를 사용하는 문서
- 위키데이터 속성 P12204를 사용하는 문서
- 위키데이터 속성 P12362를 사용하는 문서
- 위키데이터 속성 P12754를 사용하는 문서
- 위키데이터 속성 P13049를 사용하는 문서
- 검색 알고리즘
- 인터넷 검색 알고리즘