누군가 정렬되지 않은 배열 데이터 구조에서 항목을 찾는 평균 단계 수가 N/2 인 이유를 설명 할 수 있습니까?배열의 항목을 찾는 평균 단계 수는 왜 N/2입니까?
답변
명시된 질문은 잘못되었습니다. Linear search may perform better.
이것은 실제로 배열의 숫자에 대해 알고있는 내용에 달려 있습니다. 모든 확률 매스가 단일 값에있는 분포에서 모두 그려진 경우 모든 값이 같기 때문에 원하는 값을 찾기 위해 정확히 한 단계 만 거치게됩니다.
이제는 배열이 의 고유 한 값의 무작위 순열으로 채워지는 것을 매우 강력하게 가정 해 봅시다. 당신은 별개의 요소들의 임의의 정렬 된리스트를 선택하고 무작위로 그것을 치환하는 것으로 생각할 수 있습니다. 이 경우 실제로 존재하는 배열의 일부 요소를 검색한다고 가정합니다 (이 요소는 요소가 없으면 세분화됩니다). 그런 다음 취할 수있는 단계의 수는 X에 의해 주어지며, 여기서 X는 배열에있는 요소의 위치입니다. 단계 수의 평균은 그래서 식 주어진 우리가 모든 요소는 랜덤 순열에서 작성한 가정하고 있으므로
E[X] = 1 Pr[X = 1] + 2 Pr[X = 2] + ... + n Pr[X = n]
주어진다 E [X],
Pr[X = 1] = Pr[X = 2] = ... = Pr[X = n] = 1/n
인 작성자 :
E[X] = sum (i = 1 to n) i/n = (1/n) sum (i = 1 to n) i = (1/n) (n)(n + 1)/2
= (n + 1)/2
내가 생각하기에 당신이 찾고있는 대답은 다음과 같습니다.
좋은 답변입니다. 버킷 정렬이 처음에 실행되었고 모든 항목을 순서대로 저장하기에 충분한 메모리를 가지고 있으며 한 단계 걸리는 경우를 생각하고있었습니다. 나는 디럭스 델타를 생각하지 않았다. –
약한 조건을 원한다면 X가 [0, N/2]에 있고 X가 [N/2, N]에 놓일 확률이 동일 할 필요가 있습니다. –
@ GregS- 정말 충분히 강한 상태입니까? 왜 분할이 다른 분할과 비교하여 분할 될 수 있습니까? – templatetypedef
질문의 간단한 재구성을 고려 : 우리는 우리의 random
이의 고른 분포를 가지고 있다고 가정하면
int sum = 0, i;
for (i = 0; i < LARGE_NUM; i++) sum += random(n);
sum /= LARGE_NUM;
:
lim (i->inf) of (sum(from 1 to i of random(n)) /i)
의 또는 C에서 제한 될 것입니다 무엇
값 (1
에서
n
까지의 각 값이 똑같이 생성 될 수 있음)이면 예상 결과는입니다.. 평균 N/2 이유 도시
아마도 단순한 예는 다음이다 : [5, 0, 9, 8, 1, 2, 7, 3, 4, 6]
:
는 10 개 항목의 정렬되지 않은 배열을 가정한다. 이 숫자는 모두 [0..9]
입니다.
배열이 정렬되지 않았으므로 (즉, 항목의 순서에 대해 알지 못함) 배열의 특정 항목을 찾을 수있는 유일한 방법은 선형 검색을 수행하는 것입니다. 첫 번째 항목부터 시작하여 찾고있는 것을 찾거나 끝까지 도달하십시오.
그럼 각 항목을 찾는 데 필요한 작업 수를 계산해 봅시다. 첫 번째 항목 (5)을 찾는 작업은 단 한 번만 수행됩니다. 두 번째 항목 (0)을 찾는 데는 두 번 걸립니다. 마지막 항목 (6)을 찾는 데는 10 번의 작업이 필요합니다. 10 개의 항목을 모두 찾는 데 필요한 작업의 총 수는 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 또는 55입니다. 평균은 55/10 또는 5.5입니다.
"선형 검색은 평균적으로 N/2 단계를 필요로합니다"라고 평범한 지혜는 여러 가지 가정을합니다.가장 큰 두 가지는 다음과 같습니다.
찾고있는 항목이 배열에 있습니다. 항목이 배열에 없으면 N 단계를 거쳐 결정됩니다. 따라서 검색되지 않는 항목을 자주 찾고 있다면 검색 당 평균 단계 수가 N/2보다 훨씬 많을 것입니다.
평균적으로 각 항목은 다른 항목만큼 자주 검색됩니다. 즉, "0"등으로 검색 할 때마다 "6"을 자주 검색합니다. 일부 항목이 다른 항목보다 훨씬 자주 조회되는 경우 검색 당 평균 단계 수가 더 자주 검색되는 항목 번호는 가장 자주 조회되는 항목의 위치에 따라 N/2보다 높거나 낮을 것입니다.
그러나 왜 평균은 (N + 1)/2가 아닌 N/2입니까? 귀하의 예제에서, 당신은 1 + ... + 10을 합산하고 10/10으로 나눠서 55/10 = 5.5입니다. 선행 결과는 (N + 1) /2=5.5 ** ** ** N/2에 의해 결정될 수있다. – CroCo
@CroCo : "N/2"를 "약 N/2"로 읽습니다. 우리가 이러한 유형의 계산을 수행 할 때 아이디어는 정확한 숫자로 나오지 않고 단계 수를 대략적으로 계산하는 것입니다.또는 약간 다르게 설명하는 Rafe의 답변을 참조하십시오. –
내가 templatetypedef이 경우 훨씬 간단 하나가, 가장 교훈적인 답이 있다고 생각하지만.
n = 2m 인 집합 {x1, x2, ..., xn}의 순열을 고려하십시오. 이제 당신이 찾고자하는 요소 xi를 가져 가라. xi가 인덱스 m-k에서 발생하는 각 순열에 대해, 대응하는 미러 이미지 순열이 있으며, xi는 인덱스 m + k에서 발생한다. 이러한 가능한 지수의 평균은 [(m - k) + (m + k)]/2 = m = n/2이다. 따라서 집합의 가능한 모든 순열의 평균은 n/2입니다.
- 1. 배열의 모든 요소를 포함하는 항목을 찾는 중
- 2. 단계 응답 후 평균 안정 값 찾기
- 3. 배열의 차원 수는 어떻게 결정합니까?
- 4. cuke4duke가 단계 정의를 찾는 방법
- 5. 배열의 항목을 그룹화 하시겠습니까?
- 6. 다른 배열의 항목 배열의 각 항목을 가입하는
- 7. 평균 시간은가/(a-1) 동적 배열의 위키 기사에
- 8. Nyquist에서 소리의 평균/평균을 찾는 방법
- 9. 문자열 배열의 항목을 바꾸려면 어떻게해야합니까?
- 10. 배열의 항목을 다른 배열에 저장
- 11. 배열의 모든 항목을 보려면 어떻게해야합니까?
- 12. CPU 당 또는 메모리 당 평균 ASP.NET 세션 수는 얼마나됩니까?
- 13. 하루에 웹 페이지를 방문하는 평균 봇 또는 거미의 수는 얼마입니까?
- 14. 24 시간 동안 SQLite 데이터베이스의 평균 항목 수는 어떻게됩니까?
- 15. 정규식 - 일치하는 항목을 찾는 방법?
- 16. 리터럴 배열의 길이를 찾는 방법은 무엇입니까?
- 17. 문자열 배열의 길이를 찾는 방법은 무엇입니까?
- 18. 배열의 최대 값을 찾는 방법은 무엇입니까?
- 19. 배열의 패턴을 찾는 데 도움이되는 정보
- 20. onClick 리스너에서 배열의 여러 항목을 설정합니다.
- 21. PHP가 배열의 중복 된 항목을 확인합니다.
- 22. 다차원 배열의 항목을 처리하는 바로 가기?
- 23. 왜 숙제에서이 항목을 잘못 읽었습니까?
- 24. 왜 genstrings은 NSLocalizedStringFromTable 항목을 table.strings로 변환하지 않습니까?
- 25. 단계
- 26. 테이블의 행간 평균 시간 차이를 찾는 방법은 무엇입니까?
- 27. $ _POST 결과와 일치하지 않는 배열의 항목을 반환하는 방법
- 28. menuitem에서 선정 된 항목을 찾는 방법
- 29. Google 캘린더의 특정 항목을 찾는 방법
- 30. 특정 레이아웃을 사용하는 항목을 찾는 방법
글쎄, 실제로 배열을 검색하기 위해 따라야 할 알고리즘에 달려 있습니다. 사용중인 알고리즘을 언급하십시오. – deadlock
나는 분명한 사실을 놓치고 있지만, 찾고자하는 것을 찾을 때까지 각 요소를 하나 하나씩 확인한다면 분명히 평균적으로 N/2 개 요소를 검사하게 될 것입니다. (무작위 요소를 찾고 있다면) – biziclop
이것은 놀랍게도 좋은 질문입니다. 이상한 배포본에서 배열 요소를 선택하면 반드시 그 사실을 증명할 수 없습니다. 평균 N/2 단계. – templatetypedef