次优二叉树 --- 折半查找在元素不等概情况下的改进

次优查找树是对折半查找的优化,适用于元素不等概率查找的情况。文章讨论了等概率下折半查找的原理,指出在不等概率时,折半查找不再是最佳方案。介绍了最优查找树的概念及其高时间复杂度问题,然后提出次优查找树的构建方法,其目标是最小化左右子树权值累加和之差,以降低查找效率的损失。通过代码实现展示了次优查找树的创建过程,并指出当元素等概时,次优查找树相当于折半查找,构造时间复杂度为O(n log n)。
摘要由CSDN通过智能技术生成

1、次优查找树是折半查找的一种一般形式,其理论基础是“被查找的各元素是不等概的”,而折半查找就是等概的,我们在使用中默认了这一性质。
比如,对于有序数组
int a = {1,2,3,4,5};
用折半查找时,应该现比较最中间的3,如果如果待查整数等于3,查找结束。如果小于3,就继续在左边的部分数组里查找;反之,在右边的数组里查找。
问题在于,我们为什么不从4开始找呢?为什么不从1开始呢?
因为在等概率的情况下,这样能让整体的平均搜索的长度(也就是次数)最小,实际也是二分查找树的深度最小。因为相同结点数的二叉树,越是丰满的二叉树高度越小。也就是说,每个节点的左右子树的高度差最小,二叉树的高度就越小,查找越底层的元素所需要的路径长度就越短,比较次数也越少(相同结点数完全二叉树的深度小于等于其他形态的二叉树的深度)。
我的ubuntu不好画图,给你个链接看看,你自己也可以画一下图。具有12个关键字的有序表,折半查找的平均查找长度()_牛客网。你把每个元素查找成功时的路径长度加起来看看,是不是完全二叉树最小?

2、现在我告诉你,每个元素被查找的概率是不一定相同的。刚才的办法还是最佳的吗?
比如按照刚才的查找树,元素5是最后一个,按照折半查找的话,每次查找都要花费3次比较才能找到,然而元素5被查找的概率是0.8,也就是说查了10000次,可能8000次都是它,那么这8000次查找就用了 times = 8000 * 3 = 24000次查找。但是如果把5放到查找树的根节点位置,那么是不是只需要8000次比较就行了?
所以,对于每个元素被查找的概率不同的情况下,折半查找不是最佳方法!

3、如果仅仅考虑查找成功的情况,构造一颗静态 最优查找树 的性能是最好的。
用数学公式来表示就是:使得 PH=ni=1ωihi 的PH值最小的树为该数组的静态最优查找树。其中i为节点标号, ωi

折半查找,也称为二分查找,是一种常见的查找算法。它是针对有序数组进行查找的。具体步骤如下: 1. 确定查找范围的左右边界,分别为 low 和 high,初始值分别为数组的第一个和最后一个元素的下标。 2. 计算中间位置 mid,即 mid = (low + high) / 2。 3. 比较中间位置的元素与要查找的值。如果相等,返回 mid;如果小于要查找的值,说明要查找元素在右半部分,将 low 赋值为 mid + 1;如果大于要查找的值,说明要查找元素在左半部分,将 high 赋值为 mid - 1。 4. 循环执行第 2 步到第 3 步,直到 low 大于 high,表示查找失败。 下面是 PHP 代码实现: ```php function binarySearch($arr, $target) { $low = 0; $high = count($arr) - 1; while ($low <= $high) { $mid = intval(($low + $high) / 2); if ($arr[$mid] == $target) { return $mid; } elseif ($arr[$mid] < $target) { $low = $mid + 1; } else { $high = $mid - 1; } } return -1; } ``` 除了折半查找,还有二叉树查找和有序表查找二叉树查找是利用二叉树结构进行查找,每次比较当前节点的值与目标值的大小关系,然后根据大小关系往左或者往右走,直到找到目标值或者走到叶子节点为止。有序表查找是将有序表分成若干个子表,然后根据目标值与子表的范围比较,确定目标值可能在哪个子表中,然后再在该子表中进行折半查找。这两种算法的实现比较复杂,这里就不再赘述了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值