디스크 정렬과 관련된 사고

2125 단어
오늘 프로그래밍 주옥의 시작은 디스크 정렬과 관련이 있다.
쉽게 말하면 107개의 정수를 포함하는 1MB의 공간을 어떻게 활용해 정렬하는가이다.물론 비교적 좋은 조건은 안에 중복된 숫자가 없고 최대 숫자가 107을 넘지 않는다는 것이다.전화번호를 정렬해야 한다고 생각할 수 있다.
만약에 자주 사용하는 정렬 알고리즘, 예를 들어 병합, 삽입 등을 사용한다면 반드시 추가 공간이 필요하다. 물론 디스크의 공간은 충분하기 때문에 다른 파일을 신청하여 상호작용으로 정렬을 완성할 수 있다.현재 고려 중인 것은 디스크 공간을 따로 사용하지 않고 데이터를 여러 번 읽지 않는 것이다. 즉, 메모리를 한 번에 읽고 정렬을 완성하는 것이다.
만약 바이트의 각도에서 고려한다면, 읽는 문제는 모두 풀리지 않을 것이다.1MB가 100만 바이트 정도밖에 안 되기 때문에 도저히 이렇게 많은 데이터를 놓을 수 없다.물론 위치의 측면에서 고려해야 하고, 한 사람당 한 수를 표시해야 하는데, 그러면 어떻게 해야 합니까?
저자가 제시한 점에 대한 해답은 비트 벡터(예:
{2,3,6}에 대응하는 비트레이트는 {0,1,1,0,0,1}로 추정하여 저장을 실현한다.
이 사상에 따라 한 백위수 내의 정렬을 간단하게 완성하려면 100위가 넘는 데이터가 필요하기 때문에 13개의 문자를 포함하는 수조를 사용해야 한다
int bitSort()
{
    char sortRecord[13];
    const unsigned int baseNum = 0;
    const unsigned int changeNum = 1;
    int randomNum = 0;
    int row = 0;
    int column = 0;

    for(int i=0;i<13;i++)
    {
        sortRecord[i] &= baseNum;
    }

     srand((int)time(0));     
    for(int i=0;i<10;i++)
    {
        randomNum = rand()%100;
        row = randomNum/8;
        column = randomNum%8;
        sortRecord[row] |= (changeNum<<(7-column));

        printf("this random number is %d
",randomNum); } for(int i=0;i<=100;i++) { row = i/8; column = i%8; if(sortRecord[row] & (changeNum<<(7-column))) printf("%d ",i); } printf("
"); return 1; }

언어가 아무리 고급스럽고 밑바닥이 아무리 멀고 데이터 구조가 추상적이어도 실행할 때는 01 코드의 기계 언어로 전환해야 한다.따라서 고급 언어 프로그래밍을 사용할 때 그 유형의 범주에 국한되어서는 안 된다. 때로는 그들을 01의 관점에서만 고려하면 새로운 길을 열 수도 있다.
재입c++에서 자주 발생하는 각종 강제 변환은 사실 그렇게 복잡하지 않다. 이른바 변환은 부여된 이진 코드를 바꾸지 않는다. 변환은 규범화된 컴파일러가 이 01 코드를 어떻게 보는지 알려주는 것이다.같은 32자리 01열은 하나의 정수로 보일지, 부동점수로 보일지, 주소로 보일지 모두 우리가 완수해야 할 임무 두 가지에 의해 결정된다. 그러나 실행하려면 규범에 따라 제공하는 메커니즘을 따라야 한다. 그렇지 않으면 컴파일러는 그들을 어떻게 대해야 하는지 어떻게 알 수 있을까?
프로그래밍은 항상 밑바닥과 추상 사이의 왕복 전환을 끊임없이 필요로 한다.추상은 우리 자체의 지식, 예를 들어 각종 이미 알고 있는 수학 모델로 문제를 해결하는 데 써야 한다.그러나 구체적으로 어떻게 신속하게 전환된 기계가 집행할 수 있는지에 대한 측면은 당연히 이미 알고 있는 규범을 사용해야 하지만 생각할 때 규범에 국한되어서는 안 된다.

좋은 웹페이지 즐겨찾기