所以这是我写的一个方法,用于确定数组的给定索引是表示堆的最大级别还是最小级别,其中最小级别具有均匀深度(包括0),最大级别具有奇数深度。它工作正常,但它的运行时间是(我认为)O(log N)。是否有更有效的方法来执行此操作,就像具有恒定运行时间的简单数学计算一样?请注意,此方法假定数据从数组的索引1开始,而不是从索引0开始。
private boolean isMaxLevel(int i)
{
int border = 1;
int prev = 1;
int count = 1;
boolean isMax = false;
// alternates boolean between true and false as each level is checked.
while (true)
{
if (i >= prev && i <= border)
return isMax;
isMax = !isMax;
prev = border + 1;
count *= 2;
border += count;
}
}
答案 0 :(得分:1)
我不清楚你的要求是什么,但这可能对你有帮助。
public static void main(String... args) {
for (int i = 1; i <= 256; i *= 2) {
System.out.println((i - 1) + ": " + isOddHighestBit(i - 1));
System.out.println(i + ": " + isOddHighestBit(i));
}
}
public static boolean isOddHighestBit(int i) {
return (Double.doubleToRawLongBits(i) >> 52) % 2 == 0;
}
打印
0: true
1: false
1: false
2: true
3: true
4: false
7: false
8: true
15: true
16: false
31: false
32: true
63: true
64: false
127: false
128: true
255: true
256: false
答案 1 :(得分:0)
我不确定这是否更快,它可能依赖于实现,但是:
private boolean isMaxLevel(int i){
if(((int)Math.log(i+1)/Math.log(2)))%2 == 1)
return true;
return false;
}
返回正确的值。用数学的思考。你想知道以下哪个是关于i的。如果n是奇数,那么你有一个最大等级,如果n是偶数你有一个最低等级。
2ⁿ-1 <= i < 2ⁿ⁺ⁱ-1
解决这个问题我们得到:
2ⁿ-1 <= i < 2ⁿ⁺ⁱ-1
2ⁿ <= i+1 < 2ⁿ⁺ⁱ
n <= log₂(i+1) < n+1
n = floor(log₂(i+1))
然后我们可以测试n是否为奇数(n%2 == 1)
答案 2 :(得分:0)
我们必须检测最低水平和最高水平范围
1 =&gt; pow(2,0) - &gt; min level
2-3 =&gt; pow(2,1)至pow(2,2)-1 - >最大水平
4-7 =&gt; pow(2,2)至pow(2,3)-1 - > min level
8-15 =&gt;粉末(2,3)至粉末(2,4)-1 - >最大水平
c实施
#include<math.h>
#define bool int
#define true 1
#define false 0
int isMinLevel(int i,int n)//i is on min level or not
{
int h=2;
if(i==1)
return true;
while(true)
{
if(i>=pow(2,h)&&i<=pow(2,h+1)-1)
return true;
else if(i>n||i<pow(2,h))
return false;
h+=2;
}
}