题目: 有一个整数数组(元素不重复),被删除了若干个元素。要求找出被删除的数字(按照在原数组里的位置保存)。只能通过给定的函数get()访问数组,要求访问的次数最少.
#define MAX_DATA_SIZE 1000
#define MAX_DELETED_SIZE 100
enum
{
ORIGINAL_FILE,
MODIFIED_FILE
};
struct result
{
int count;
int data[100];
};
int deleted_index[MAX_DELETED_SIZE];
int original_file[MAX_DATA_SIZE];
int modified_file[MAX_DATA_SIZE];
int deleted_index_map[MAX_DATA_SIZE];
int data[2][MAX_DATA_SIZE];
int get_count;
int data_size = 100;
int offset;
int get(int fileIndex, int index)
{
if(get_count >= 2 * MAX_DATA_SIZE)
{
return -1;
}
get_count++;
if(index >= data_size)
{
return 0;
}
if(fileIndex == ORIGINAL_FILE)
{
return original_file[index];
}
else if(fileIndex == MODIFIED_FILE)
{
return modified_file[index];
}
}
///
int myGet(int fileIndex, int index)
{
if(data[fileIndex][index] == 0)
{
data[fileIndex][index] = get(fileIndex, index);
}
return data[fileIndex][index];
}
int getLength(int fileIndex)
{
int start = 0, end = MAX_DATA_SIZE-1;
int mid;
while(start < end)
{
mid = (start + end)/2;
if(myGet(fileIndex, mid) == 0)
{
end = mid;
}
else
{
start = mid + 1;
}
}
return start;
}
struct result ret;
#if 0
int getDeletedItem(int &x1, int &y1, int &x2, int &y2)
{
int mid1, int mid2; //= (start + end) / 2;
while( x1 < y1)
{
mid1 = (x1 + y1) / 2;
mid2 = (x2 + y2) / 2;
if(myGet(ORIGINAL_FILE, mid1) != myGet(MODIFIED_FILE, mid2))
{
y1 = mid1;
y2 = mid2;
}
else
{
x1 = mid1 + 1;
x2 = mid2 + 1;
}
}
ret.data[ret.count] = myGet(ORIGINAL_FILE, x1);
ret.count++;
return start;
}
#endif
int FindDeletedItems(int start, int end, int offset, int *deletedCount)
{
if(end == start)
{
if(myGet(MODIFIED_FILE, start) != myGet(ORIGINAL_FILE, start + offset))
{
ret.data[ret.count] = myGet(ORIGINAL_FILE, start + offset);
ret.count++;
*deletedCount = *deletedCount - 1;
}
return ret.count;
}
int mid = (start + end) / 2;
int value = myGet(MODIFIED_FILE, mid);
if(value != myGet(ORIGINAL_FILE, mid + offset))
{
offset = FindDeletedItems(start, mid, offset, deletedCount);
}
if(*deletedCount != 0)
{
return FindDeletedItems(mid + 1, end, offset, deletedCount);
}
}
void myfunc(void)
{
int originalLength = getLength(ORIGINAL_FILE);
int modifiedLength = getLength(MODIFIED_FILE);
int datalen = originalLength - modifiedLength;
FindDeletedItems(0, modifiedLength, 0, &datalen);
#if 0
int x1 = 0, x2 = 0, y1 = originalLength, y2 = originalLength;
int offset = 0;
while(datalen > 0)
{
int newStart = getDeletedItem(x1, y1, x2, y2);
datalen--;
x1 = newStart + 1;
y =
}
#endif
}
///
int main(void)
{
int data_size = 100;
int i;
for(i = 0; i < data_size; i++)
{
original_file[i] = i+10;
}
for(i = 0; i < data_size; i++)
{
int m = random()%data_size;
int n = random()%data_size;
int temp = original_file[m];
original_file[m] = original_file[n];
original_file[n] = temp;
}
int j = 0;
while( j < 10)
{
int k = random()%data_size;
if(deleted_index_map[k] == 0)
{
deleted_index_map[k] = 1;
j++;
}
}
j = 0;
for(i = 0; i < data_size; i++)
{
if(deleted_index_map[i] == 0)
{
modified_file[j++] = original_file[i];
}
}
myfunc();
return 0;
}