디스크 정렬과 관련된 사고
쉽게 말하면 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열은 하나의 정수로 보일지, 부동점수로 보일지, 주소로 보일지 모두 우리가 완수해야 할 임무 두 가지에 의해 결정된다. 그러나 실행하려면 규범에 따라 제공하는 메커니즘을 따라야 한다. 그렇지 않으면 컴파일러는 그들을 어떻게 대해야 하는지 어떻게 알 수 있을까?
프로그래밍은 항상 밑바닥과 추상 사이의 왕복 전환을 끊임없이 필요로 한다.추상은 우리 자체의 지식, 예를 들어 각종 이미 알고 있는 수학 모델로 문제를 해결하는 데 써야 한다.그러나 구체적으로 어떻게 신속하게 전환된 기계가 집행할 수 있는지에 대한 측면은 당연히 이미 알고 있는 규범을 사용해야 하지만 생각할 때 규범에 국한되어서는 안 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.