문제

당신은 큰 목록이 있는(말 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로 변경하는 것으로 생각합니다. 루프에 '다른 패스'를 배치하지 않는 한 그렇지 않습니다.

나는 모든 질문에 대답하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top