首页 > 试题广场 >

假设在有序线性表A[1..30]上进行二分查找,则比较五次查

[单选题]
假设在有序线性表A[1..30]上进行二分查找,则比较五次查找成功的结点数为(      ) 
  • 8
  • 12
  • 15
  • 16
2的4次方–1=15,30–15=15
发表于 2020-07-04 09:44:05 回复(0)
30-(2^4-1)
发表于 2020-04-07 10:42:58 回复(0)
按照完全二叉搜索树构建即可数出来
发表于 2019-07-18 16:59:03 回复(0)
线性表长度为n,二分查找比较k次,若k不是最下面一层,那么比较成功的结点数为2k-1,若k是最下面一层,也即2k>=n,那么结点数为n-(2k-1-1)
发表于 2021-04-07 10:40:45 回复(0)
30-(24-1)=15,n层排满二叉树的节点总数为2n-1
发表于 2020-03-17 16:25:21 回复(0)

我们可以画出二分查找的搜索路径树:

编辑于 2019-08-06 20:55:00 回复(7)
答:查找一次成功的节点数为1,值为15
查找二次成功的节点数为2,值为7,,23
查找三次成功的节点数为4,值为3,11,19,27
查找四次成功的节点数为8,值为1,5,9,13,17,21,25,29
查找五次成功的节点数为15,值为2,3,4,6,8,10,12,14,16,18,20,22,24,26,28,30

发表于 2019-05-30 19:29:32 回复(4)

写了一段代码测试了一下

public class BinarySearch {
    static Map<Integer, Integer> map = new HashMap<>();
    public static void main(String[] args) {
        int[] a = new int[30];
        for (int i = 0; i < a.length; i++) {
            a[i] = i + 1;
        }
        for (int i = 0; i < a.length; i++) {
            binarySearch(a, a[i]);
        }
        for (Map.Entry entry : map.entrySet()){
            if (entry.getValue() == (Integer)5){
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
        }
    }

    static Map<Integer, Integer> binarySearch(int[] a, int key){
        int low = 0;
        int high = a.length - 1;
        int compTimes = 0;
        while (low <= high) {
            ++compTimes;
            int mid = (low + high) / 2;
            if (a[mid] == key){
                map.put(key, compTimes);
                return map;
            }else if (a[mid] > key){
                high = mid - 1;
            }else {
                low = mid + 1;
            }
        }
        return null;
    }
}

输出结果为:
2:5
4:5
6:5
8:5
10:5
12:5
14:5
16:5
18:5
20:5
22:5
24:5
26:5
28:5

30:5
二分查找的次数为logN,最多查找5次的话,那么N最大可以是31,最小可以是16,最多有31个数。规律应该是这样。
31个数经过5次查找成功的节点数为25-1=16
30个数经过5次查找成功的节点数为25-1-1=15
29个数经过5次查找成功的节点数为25-1-2=14
...
16个数经过5次查找成功的节点数为25-1-15=1
15个数经过5次查找成功的节点数为25-1-16=0
编辑于 2019-06-16 09:54:36 回复(4)
二分查找比较n次后,查找成功的节点数是(2n-1-1);
所以上述题的解为:25-1-1=16-1=15
为什么是n-1次方呢?因为从0次方算起,0,1,2,3,4共5趟
那为什么要减去1呢?因为第一次只取了一个中心点(20=1)
发表于 2019-06-04 15:38:54 回复(0)

这里有个小套路,总共30个元素,最后16个的话就31个元素了

发表于 2019-08-09 10:00:10 回复(0)
看错啦 原来题目是求有几个点  我算出具体可以查找到那个点。
发表于 2019-08-03 21:21:02 回复(5)
第五层的节点数?
编辑于 2019-06-02 11:49:24 回复(1)
1费1个,2费2个,3费4个,4费8个。5费最多16个,但是如果是16个和前面加起来就是31,超过了数组长度,所以5费实际是15个。
发表于 2020-05-16 20:44:15 回复(0)
我表示没懂这个题啥意思,不是应该找节点吗,节点数是什么个意思
发表于 2019-08-29 13:57:32 回复(0)
感觉题目描述不清楚......
发表于 2019-11-06 11:26:15 回复(0)
是结点的数量不是结点的index...
发表于 2020-03-28 12:08:37 回复(0)
这个题有点阐述不明,第五次查找出来的,算不算前几次找出来的。
发表于 2019-06-11 11:37:31 回复(0)
2的n-1次方-1
发表于 2023-02-23 20:44:40 回复(0)
30-1-2-4-8=15
发表于 2022-11-22 13:37:41 回复(0)
结点数是节点个数,会不会有人像我一样以为是结点编号,然后验证的。。。麻了
发表于 2022-08-21 16:53:41 回复(0)