Algorithm 确定数组长度的算法
描述一种可以确定数组长度的算法,单位为O(logn)。Ok。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误 然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n 是O(logn) 编辑Algorithm 确定数组长度的算法,algorithm,Algorithm,描述一种可以确定数组长度的算法,单位为O(logn)。Ok。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误 然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n 是O(logn) 编辑 此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBounds。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。
此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBounds。尽管你的问题相当模糊,我还是会把我上面的评论作为回答 通过i=1,2^1,2^2。。。2^m,直到出现ArrayIndexOutofBounds错误 然后在2^(m-1)和2^ m之间搜索二进制文件,直到找到错误消失的边界。那是n 是O(logn) 编辑 此建议基于您作为注释发布的代码段,其中很明显允许您检测ArrayIndexOutofBoundsC样式的伪代码:
int lengthOfArray(p){
int j = 1;
try{
while(j < Integer.MaxValue){
p[j]; // Might need to do something more with p[i]
// to test bound.
j *= 2;
}
}catch(ArrayIndexOutOfBounds e){
}
j = searchArrayHelper(p, j/2, j);
try{
while(1){
// This loop is guaranteed to run O(log n) times or less.
p[j];
j++;
}
}catch(ArrayIndexOutOfBounds e){
j--;
}
return j;
}
int searchArrayHelper(p, int i, int j){
try{
p[j];
} catch (ArrayIndexOutOfBounds e){
int mid = (i + j)/2;
return searchArrayHelper(p, i, mid);
}
return i;
}
int lengthOfArray(p){
int j=1;
试一试{
而(j
C样式伪代码:
int lengthOfArray(p){
int j = 1;
try{
while(j < Integer.MaxValue){
p[j]; // Might need to do something more with p[i]
// to test bound.
j *= 2;
}
}catch(ArrayIndexOutOfBounds e){
}
j = searchArrayHelper(p, j/2, j);
try{
while(1){
// This loop is guaranteed to run O(log n) times or less.
p[j];
j++;
}
}catch(ArrayIndexOutOfBounds e){
j--;
}
return j;
}
int searchArrayHelper(p, int i, int j){
try{
p[j];
} catch (ArrayIndexOutOfBounds e){
int mid = (i + j)/2;
return searchArrayHelper(p, i, mid);
}
return i;
}
int lengthOfArray(p){
int j=1;
试一试{
而(j
你的问题太重要了,让我想做家庭作业。你可以在O(1)中找到数组的长度。我们需要更多的上下文来回答这个问题。@TheBigO:请在C中实现int lengthOfArray(void*p)
。下面是我如何调用您的方法:int*p=(int*)malloc(sizeof(int)*42);int length=长度farray((void*)p);printf(“%d\n”,长度)代码>如果这太难,实现int lengthOfArray(int*p)代码>我将如上所述调用,而不强制转换为void*
@Jason,我在下面添加了一个答案,给出了新的信息。请使用0,1,2^1,2^2的“算法”,。。。2^m,直到阵列索引超出边界。然后在2^(m-1)和2^ m之间搜索二进制文件。是O(logn)你的问题如此迫切,让我感觉像是在做作业。你可以在O(1)中找到数组的长度。我们需要更多的上下文来回答这个问题。@TheBigO:请在C中实现int lengthOfArray(void*p)
。下面是我如何调用您的方法:int*p=(int*)malloc(sizeof(int)*42);int length=长度farray((void*)p);printf(“%d\n”,长度)代码>如果这太难,实现int lengthOfArray(int*p)代码>我将如上所述调用,而不强制转换为void*
@Jason,我在下面添加了一个答案,给出了新的信息。请使用0,1,2^1,2^2的“算法”,。。。2^m,直到阵列索引超出边界。然后在2^(m-1)和2^ m之间搜索二进制文件。它是O(logn)在你的第二个函数中,你似乎返回了你发现的第一个p[j],它不会触发ArrayIndexOutOfBounds,但是你怎么确定p[j+1]会触发它,所以j是数组长度呢?@belisarius,你是对的,那里可能有一个小错误。我将编辑答案以发布一个快速修复。我做了修复,尽管它感觉像一个肮脏的黑客。如果您注意到任何其他错误,请告诉我。在第二个函数中,您似乎返回了您发现的第一个p[j],它不会触发ArrayIndexOutOfBounds,但您如何确定p[j+1]会触发它,因此j是数组长度?@belisarius,您是对的,那里可能有一个小错误。我将编辑答案以发布一个快速修复。我做了修复,尽管它感觉像一个肮脏的黑客。如果您注意到任何其他错误,请告诉我。