분류 큰 목록의 시험 점수
-
28-09-2020 - |
문제
당신은 큰 목록이 있는(말 N>10000)테스트의 점수는 당신하고 싶다.시험 점수가 1 과 100 사이입니다.무엇이 가장 빠른 방법으로 목록을 정렬?
먼저 생각했다.우리는 O(N 로그 N)바인딩,그러나 우리는 또한 추가 정보를 대량으로 배열에,그래서 난 우리가 더 잘 할 수 있습니다.
두 번째 생각:해야 우리가 사용하는 해시 테이블,우리는 케어에 대해 중복?시 사용하는 방법을 해시 테이블이 있습니다.
제 생각:이것을 함께 할 수있는 뭔가가있 기수 정렬?아무 생각이 없습니다.
네 번째 생각:우리는 이 목록을 정렬을 작성하여 다른 목록,그리고 그런 다음 전달을 통해 원본 주파수를 계산하는 요소의 발생했습니다.그러나 우리는 다른 통과를 만드는 큰 정렬된 목록하는 것 O(N^2).즉 너무 큽니다.
이것이 아주 쉬운 질문 또는 아주 어려운 질문?
해결책
이것은 매우 쉽게 질문하고 가정하면,모든 점수가 정수입니다.
여기에는 간단한 알고리즘에서는 일반 단어입니다.우리는 우리를 시작합니다 count
, 정수 배열의 100zeros.에 대한 각각의 점수 s
, 우리는 것이다 추가 1 count[s]
.을 생산하고 싶어 정렬 점수를,우리는 출력 count[1]
1s, count[2]
2s,...,그리고 마지막으로 count[100]
100s.
이 종류의 정렬 알고리즘이라는 계산합니다.
의 경우 보다 더 $N>10000$ 시험 점수는 1 과 100 사이의 주요의 사용량을 계산합니다.시간 복잡도 $O(N)$ 와 공간 복잡성에 의해 제한된 몇 가지 작은 일정한 다수의 100.
를 확인 할 수 있습니다 정렬 계산 자세한 내용은.
다른 팁
예, 병합과 같은 정렬 알고리즘을 사용하여 우리는 이것을 o (n * logn)로 얻을 수 있습니다. 여기에서 더 잘할 수 있습니다. 테스트 점수의 경계에 관한 추가 정보는 여기에서 매우 유용합니다.
우리는 중복을 걱정합니까?
우리가 그냥 점수를 다루고 student_name 또는 subject_info와 같은 다른 정보를 걱정하지 않으면 u 가이 알고리즘을 사용할 수있는 정렬 형식으로 점수를 원한다면.
maintain a int table[101] = {0} - hash table with key as score
//all elements are initialised to 0
array contains all scores
for score in array
table[score] = table[score] +1
//above in O(N) time and O(1) space.
sorted_list = {} // initially empty
for (score= 0; score < 101;i++)
for(count = 0; count < table[i]; count++)
sorted_list.add(score)
//the above runs in O(N) time and O(N) space.
.
이제는이 아래 에이 접근법을 사용하기 위해 소속 된 학생 / 제목과 같은 점수가 정보를 신경 쓰지 않으면 정보를 걱정하십시오. 나는 당신이 점수와 관련 정보를 C / C ++ 구조 또는 객체 형식으로 저장할 것이라고 가정합니다.
이제 해시 크기 100 (테스트 점수 범위)을 유지 관리합니다. 키= 점수 value=이 점수가있는 개체 목록 또는 인스턴스 목록 (만약 학생 목록을 정렬 한 다음이 점수를 가진 학생 목록)
C / C ++에 익숙한 경우이 데이터 구조는 링크 된 목록의 배열을 사용하여 구현할 수 있습니다. 여기에 사용 된 해시 기술은 별도의 해싱 입니다.
데이터 구조 기능은 다음과 같습니다. DS [점수]는 링크 된 목록에 대한 포인터 / 참조가 있습니다. 다른 해시 맵을 사용하여 DS에서 각 하위 목록의 꼬리를 식별하려면 O (1) 시간에 새 요소를 삽입 할 수 있습니다.
i= 0에서 i까지 단일 통과에서
삽입 후 우리는 생성 한 DS에서 단일 통과가있는 새 목록을 만들 수 있습니다.
알고리즘은 이와 같습니다.
배열이 각각의 점수가있는 모든 객체를 포함합니다
for (i = 0; i< n; i++)
key = array[i].score
DS[key].insert(array[i]) //the tail part can be used for O(1) insertion.
//the above loop runs in O(N)
sorted_list = {} // empty_list
for(score = 1; score<=100;score++)
for each (obj in DS[score])
sorted_list.add(obj)
//the above loop runs in O(N).
//the N refers to the size of original list here.
.
이 접근법은 큐 기반 기수 종류의 기본 100입니다. 기기 구현과 큐 구현을 사용하여 정렬에 대해 자세히 알아보십시오.
질문에서 : "네 번째 생각 : 다른 목록을 만들어이 목록을 정렬 한 다음 요소의 원래 계산 주파수를 통과 할 수 있습니다. 그러나 다른 패스가 필요합니다. 이는 더 큰 정렬 된 목록을 만들 수 있습니다. 이것은 o (n ^ 2)입니다. 즉 너무 큰. "
다른 패스가 N2를 n2로 변경하는 것으로 생각합니다. 루프에 '다른 패스'를 배치하지 않는 한 그렇지 않습니다.
나는 모든 질문에 대답하기를 바랍니다.