2011-08-06 7 views
2

데이터 파일을 읽고 바이트 배열로 데이터를 침투시키는 프로그램이 주어진 곳에서 작업을하고 있습니다. 첫 번째 4 바이트 배열의 얼마나 많은 사람들의 이름을 알 수 있습니다 (데이터 파일 포함). 사람들의 이름 문자열을 보유하고있는 배열의 나머지 부분 다음. 이 배열의 주소는 다음과 같습니다. const void * foo;바이너리 검색을 위해 파일 중간에 접근하는 방법

예를 들어, 처음 4 바이트는 배열에 5 개의 이름이 저장되어 있고 다음 4 바이트는 그 사람의 주소를 알려줍니다. 사람의 이름은 배열에 저장되어

int num = ((int*)foo)[0]; 
const int ppl1 = ((int*)foo)[1]; 
string name = ((char*)foo)+ppl1; 

그래서 num는 배열에 5 명을 프로그래머와 ppl1는 당신에게 당신이 첫 번째 이름과 이름을 찾을 수있는 배열의 위치를 ​​말할 것 말의 이름을 수집하는 것 배열의 해당 슬롯에있는 사람.

꽤 많이, 배열에서 검색 할 이름을 부여 받았으며 이진 검색을 사용하여 작업을 수행하려고했습니다. 나는 파일의 중간을 찾는 방법을 모르지만 너희들이 나에게 몇 가지 조언을 해줄 수 있니?

건배 =]

EDIT : 그래서이 생성되지만 결함에 세그먼트 및 (첫 번째 항목을 검색 할 때) 만 한 경우에 대해 작동한다. 왜 생각이 ...

int first = 0; 
    int num = ((int*)foo)[0]; 
    int last = num; 


    while (first <= last) { 
     int middle = first+last/2; 
     int offset = ((int*)foo)[middle]; 
     string name = ((char*)foo)+offset; 
     if (person < name) { 
      last = middle-1; 
     } else if (person > name) { 
      first = middle+1; 
     } else { 
      break; 
     } 
+0

이진 검색을 사용하려면 데이터를 정렬해야합니다. 그게 너 때문 이니? – Mat

+0

예 데이터가 정렬됩니다 (모든 이름이 정렬 됨) – SNpn

+0

디스크는 임의 액세스보다 순차 액세스가 훨씬 좋습니다. 그리고 기본 단위는 섹터 또는 심지어 섹터의 클러스터입니다. 바이너리 검색이 보장되는지 확인하십시오. 메모리에있는 모든 것을 꿀꺽 꿀꺽 마시는 충분한 데이터가 실제로 유효한 옵션이 아닌 경우 작업에 더 적합한 데이터 구조의 B-Tree를 찾습니다. – AProgrammer

답변

1

당신은 요소의 수를 알고 데이터 구조는 당신이 어떤 요소에 랜덤 액세스 수행 할 수 있습니다

const int middleOffset = ((int*)foo)[num/2]; 
string middleName = ((char*)foo)+middleOffset; 
+0

하지만 그건 중간에 항상 const가 될까요? – SNpn

+0

중간은 데이터가 다시로드 될 때까지 변경되지 않으므로 const로 넣으십시오. 그러나 검색 알고리즘 내에서 재 할당 할 수있게하려면'const'를 건너 뛰십시오. –

1

기능 seekg와 C의 tellg ++ 파일 스트림을 파일을 탐색 할 수 있습니다.

관련 문제