이것은 우스운 질문 일지 모르지만 입력의 크기가 커질수록 실제로 더 쉽게 문제가 발생할 수 있습니까? 나는 실제적인 문제가 이런 것이 아닌지 의심하지만, 우리는이 속성을 가진 퇴보적인 문제를 발명 할 수있다. 예를 들어, 크기가 커지거나 기괴한 방식으로 동작함에 따라 "자체 해결"을 시작할 수 있습니다.
이것은 우스운 질문 일지 모르지만 입력의 크기가 커질수록 실제로 더 쉽게 문제가 발생할 수 있습니까? 나는 실제적인 문제가 이런 것이 아닌지 의심하지만, 우리는이 속성을 가진 퇴보적인 문제를 발명 할 수있다. 예를 들어, 크기가 커지거나 기괴한 방식으로 동작함에 따라 "자체 해결"을 시작할 수 있습니다.
답변:
아니요, 가능하지 않습니다. 적어도 점근 적 의미가 아니므로 로 영원히 더 쉽게 계속 유지하기 위해 문제가 필요한 경우 .
하자 이러한 문제 해결을위한 최적의 주행 시간이 입력의 크기이다. 실행 시간은 알고리즘에 의해 실행되는 명령 수의 개수이므로 음이 아닌 정수 여야합니다. 즉, 모든 대해 입니다 . 이제 함수 하면 엄격하게 단조 감소하는 함수는 없습니다. ( 이 무엇이든 , 유한해야합니다 라고 말하십시오 . 그러나 가 단조롭게 엄격하게 감소하기 때문에 및비슷한 이유로, 적으로 엄격하게 감소하는 함수는 없습니다 : 이 존재하는 곳에서 실행 시간 함수 이 없음을 유사하게 증명할 수 있습니다. 이 모든 , 는 단조롭게 엄격히 감소합니다 (이러한 기능은 결국 부정적이어야 함).
따라서 실행 시간이 음이 아닌 정수 여야한다는 간단한 이유로 이러한 문제는 존재할 수 없습니다.
이 답변은 결정 론적 알고리즘 (즉, 최악의 경우 실행 시간) 에만 적용됩니다 . 예상 실행 시간이 엄격하게 단조롭게 감소하는 무작위 알고리즘의 가능성을 배제하지는 않습니다. 그런 알고리즘이 존재할 수 있는지 모르겠습니다. 이 관찰에 대해 Beni Cherniavsky-Paskin에게 감사드립니다 .
귀하의 질문에 대한 답변은 아니지만 Boyer-Moore 문자열 검색 알고리즘 이 가깝습니다. Robert Moore는 자신의 웹 페이지에서 알고리즘에 대해 말합니다.
우리의 알고리즘은 패턴이 길수록 알고리즘의 속도가 빠르다는 독특한 특성을 가지고 있습니다.
다시 말해, 일반적으로 알고리즘은 소스 문자열에서 대상 문자열의 인스턴스를 검색하고 고정 된 소스 문자열을 검색하면 대상 문자열이 길수록 알고리즘 실행 속도가 빨라집니다.
분명히 순수한 수학적, 순수한 CS 알고리즘 관점에서 이것은 불가능합니다. 그러나 실제로 프로젝트를 확장 할 때 실제 사용자에게 직관적이지 않은 여러 실제 사례가 있습니다.
길 찾기 : 길 찾기 가 길수록 길어질 수 있습니다. 예를 들어, Google지도에서 3000 마일 서쪽으로가는 길을 알려주려면 서해안으로 운전하여 크로스 컨트리 운전 지침을받을 수 있습니다. 그러나 서쪽으로 6000 마일을 가고 싶다면 NYC에서 홋카이도까지 비행기를 타면 훨씬 간단한 지시가 나옵니다. 교통, 도로, 날씨 등을 통합하는 크로스 컨트리 경로를 제공하는 것은 알고리즘 적으로 어렵지만, 비행기를 타고 데이터베이스에서 항공편을 찾는 것은 비교적 간단합니다. 난이도와 거리의 ASCII 그래프 :
| /
| /
Difficulty | / ____-------
| / ____----
| / ____----
---------------------------------
Distance
렌더링 : 한면 의 렌더링과 1000면의 렌더링을 원한다고 가정하십시오. 이것은 빌보드 광고를위한 것이므로 두 최종 이미지는 10000 x 5000 픽셀이어야합니다. 한면을 사실적으로 렌더링하는 것은 어려울 것입니다. 수천 개의 픽셀 해상도에서 강력한 기계를 사용해야합니다. 그러나 1000 개의면으로 구성된 군중의 경우 각면에서 10 개의 픽셀 만 있으면되며 쉽게 복제 할 수 있습니다! 랩톱에서 1000 개의 얼굴을 렌더링 할 수도 있지만 10000px의 사실적인 얼굴을 렌더링하는 데 시간이 오래 걸리고 강력한 시스템이 필요합니다. 난이도 vs. 렌더링 된 객체의 ASCII 그래프로, n 크기의 이미지로 n 개의 객체를 렌더링하는 데 어려움이 얼마나 빠르지 만 느리게 반환되는지 보여줍니다.
| -
|- - _________
Difficulty | -- ______-------
| ------
|
---------------------------------
Objects
하드웨어 제어 : 하드웨어를 사용하는 것이 훨씬 쉬워집니다. "모터 X 1도 이동"은 어렵거나 불가능하며 "모터 X 322도 이동"에 대해 다루지 않아도되는 모든 종류의 문제를 처리해야합니다.
짧은 기간의 작업 : 매초마다 항목 X를 (매우 적은 시간) 켜고 싶다고 가정하십시오. X가 실행되는 시간을 늘리면 덜 복잡한 소프트웨어와 하드웨어가 필요합니다.
정보학에 대한 우리의 철학은 문제를 더 많이 읽을수록 문제를 해결하는 것이기 때문에 문제는 흥미롭고 유용합니다. 그러나 사실, 전형적인 방식으로 제시되는 (어려운) 대부분의 문제는 "쉬운"방식으로 쉽게 표현 될 수 있습니다. DW의 반응을 아는 것조차도 (쉬운 것이 더 빠르다는 의미는 아니라는 것을 잘못 생각하면 "느리게"를 의미합니다. 따라서 음수 시간을 찾을 필요가 없으며 점근 적 시간을 찾기 위해 노력해야합니다).
하나를 찾는 요령은 힌트로 솔루션의 일부를 항목으로 넣고 문제의 항목을 상수 매개 변수와 같이 고려하는 것입니다.
예 : 런던과 파리를 잇는 가장 먼 길은 프랑스와 영국 도시를 두 번 방문하지 않고 다른 나라를 방문하지 않는 방법은 무엇입니까? 고려, 당신은 애쉬 포드 전에 버밍엄, 베르사유 전에 올리언즈, 리 무주 전에 라로 셸 등을 가야합니다 ...
긴 항목에 대한이 문제는 짧은 항목에 비해 더 쉬울 것입니다.
사용 예 : 머신이 관리하는 게임 게임을 상상해보십시오. 컴퓨터의 IA는 더 많은 힌트를 찾기 위해 게임에서 더 많은 것을 탐색해야하는지 또는 지금 결정해야 할 최선의 결정을 추론 할 시간인지 결정해야합니다. .
암호에 대해 알고있는 정보를 입력 한 다음 해독하려고하는 프로그램을 고려하십시오. 나는 이것이 당신이 원하는 것을한다고 생각합니다. 예를 들면 다음과 같습니다.
이와 같은 문제는 입력 크기와 반대이기 때문에 이것이 속임수라고 덧붙여 야합니다. 추상화의 한 계층을 제외하고 입력이 없으면 입력 크기가 크고 (모든 기호 및 단어 길이 확인) 시작에 올바른 암호를 입력하면 작다고 말할 수 있습니다.
그래서 그것은 당신이 얼마나 많은 추상화를 허용하는지에 달려 있습니다.
사실, 데이터가 증가함에 따라 점점 작아지는 문제가 있습니다. 내 응용 프로그램 중 하나는 치즈와 같은 특정 제품의 속성을 기록합니다. 속성은 예를 들어 CheeseType, Brand, Country, Area, MilkType 등입니다. 매월 정도마다 그 기간 동안 시장에 출시 된 새로운 치즈 목록과 속성이 표시됩니다. 이제 이러한 속성은 인간 그룹에 의해 손으로 입력됩니다. 일부는 오타를 만들거나 모든 속성의 가치를 모릅니다.
데이터베이스에서 검색 할 때 이러한 속성을 기반으로 치즈의 맛을 통계에서 예측하려고합니다. 무슨 일이 일어나는가는 각 속성마다 값의 범위로 끝납니다. 일부는 유효합니다. 일부는 유효하지 않습니다. 이러한 잘못된 데이터를 제거하거나 수정하는 것은 데이터가 충분한 경우에만 가능합니다. 희귀하지만 유효한 값을 제거하지 않고 실제 값과 노이즈를 차별화하는 것입니다.
당신이 상상할 수 있듯이, 작은 볼륨으로, 물건을 올바르게 고치기에는 소음이 너무 중요합니다. 체다 5 개, 브리 1 개, 브리 1 개, 체다 1 개가있는 경우 어느 것이 정확하고 오타인지 어떻게 알 수 있습니까? 볼륨이 높을수록 오타가 매우 낮아지는 경향이 있지만 드문 값은 몇 가지 중요한 증분을 가져와 소음에서 벗어날 수 있습니다 (경험이 뒷받침합니다). 이 경우, 예를 들어 50000 Cheddar, 3000 Brie, 5 Bri, 15 Chedar를 상상할 수 있습니다.
예, 충분한 데이터가 있으면 일부 문제가 결국 스스로 해결됩니다.
NP- 완전 문제 3-SAT를 고려하십시오. x_i = true / false 형식의 입력을 제공하여 문제를 계속해서 증가 시키면 개별 분리를 2 변수 절로 변환하여 결정적으로 P 인 2-SAT 문제를 만들거나 단순히 참 / 거짓 대답.
x_i = true / false 입력 (이러한 입력이 여러 번 제공되거나 모순되는 입력)에 중복이있는 경우 입력을 쉽게 정렬하고 중복 값을 무시하거나 값이 상충하는 경우 오류를보고 할 수 있습니다.
어쨌든, 이것은 입력 수가 증가함에 따라 해결하기 쉬운 '현실적인'문제를 나타냅니다. '쉬운'측면은 NP- 완전 문제를 P 문제로 변환하는 것입니다. 정렬만으로 문제를 강제하는 것보다 시간이 오래 걸리도록 어리석은 입력을 제공하여 시스템을 게임 할 수 있습니다.
이제 우리가 T (0) (위의 답변에서 DW의 표기법을 사용함)을 기꺼이 받아 들일 수 있다면 정말 멋진 시나리오가 될 것입니다. 예를 들어 T (0)은 Turing 's Halting Problem을 해결하는 것과 같습니다. 더 많은 입력을 추가하는 것이 해결할 수있는 문제로 변환 될 수있는 문제를 고안 할 수 있다면 금을 have습니다. 문제를 해결할 수있는 문제로 무조건 변환하는 것만으로는 충분하지 않습니다. 이는 문제를 강제하는 것만큼이나 나쁘기 때문입니다.
질문은 "입력의 크기가 커짐에 따라 실제로 더 쉽게 문제를 일으킬 수 있는가?"라고 묻습니다. 입력이 알고리즘에서 작업을 수행하는 데 사용할 자원 인 경우 어떻게됩니까? 리소스가 많을수록 좋습니다. 아래는 직원이 많을수록 좋은 예입니다.
1) 두 가지 입력이 제공됩니다.
i) 업계 직원 수. 이것은 자연수이며 주 입력 입니다.
ii) 산업에 관한 정보. 있다 노동자가 수행해야하는 작업을하는 레이블, B, C, D는 ... 있습니다 작업 사이를 전환 할 직원을 가능하게하는 작업을 연결하는 곳. 여기에는 0, 1, 2, 3 ...이라는 레이블이 붙어 있습니다. 주어진 정보는 경로로 구성된 간단한 유 방향 그래프입니다 (예 : A-1, 1-2, 2-B, C-3 ...). 루트 비용은 1입니다.t p
2) 문제 :
첫 번째 작업 A부터 시작하여 직원 수가 명인 경우 모든 작업을 방문하기 위해 직원이 사용할 수있는 최적의 전략을 찾아야합니다. 작업을 두 번 이상 방문 할 수 있습니다. 작업간에 경로를 찾지 않으면 작업간에 전환 할 수 없습니다. 작업 A에서 B 로의 경로는 B에서 A 로의 경로와 무관합니다.
3) 출력 :
출력은 직원이 수행해야 할 작업 사이의 경로입니다. 각 경로는 직원 수와 관련이 있습니다. 예를 들면 다음과 같습니다.
직원 이 A-B (전달 경로) 직원
이 A-C (전달 경로)
B-D ( 직원) (전달 경로)
D-B ( 직원) (역방향 경로)
B-E ( 직원) (정방향 경로), N 2 N 3 N 4 N 5
4) 가능한 해결책 : 가능한 해결책
중 하나는 먼저 A에서 가장 가까운 노드까지의 최단 경로를 계산하는 것입니다. 이것은 정방향 경로입니다. 그런 다음 방문한 각 작업의 정방향 경로를 재귀 적으로 계산합니다. 결과는 나무입니다. 예를 들면 다음과 같습니다.
에이 기원전 DE
이제 직원들이 나무를 통과하여 작업을 방문하는 방법을 결정할 때입니다. 직원 이 작업 A부터 시작하여 은 왼쪽 하위 트리 로 전송 되고 는 오른쪽 하위 트리로 전송됩니다. 경우 다음 왼쪽 하위 트리에서 아무도 오른쪽 하위 트리에 갈 필요가 없습니다 이제까지합니다.n 1 n 2 n 2 ≠ 0
들어 직원 모두 단지 앞으로 이동합니다. 를 들어 직원은 다른 작업을 방문하기 위해 역 경로를 사용해야합니다. 예를 들어 D에서 B의 경우 알고리즘은 가장 짧은 경로를 계산합니다. 이것은 추가 계산입니다. D에서 E까지 가장 짧은 경로를 직접 계산해보십시오. 잘만되면 그것은 여전히 여분의 계산입니다.n = 1
그러나 물론 계산 시간은 무한히 줄어들지 않을 것입니다 ( 너무 크면 리소스 관리 및 자료가 열악해질 수 있습니다).