剪枝搜索

剪枝搜索是搜索中常用的一个方法,Binary Search就是一个经典的剪枝搜索例子,在Biniary Search中

int binarySearch(int A[], int low, int high, int key)
{
    int mid;
    while (low <= high)
    {
        mid = (low + high) >> 1;
        if (key < A[mid]) high = mid - 1;
        else if (key > A[mid]) low = mid + 1;
        else return mid;
    }
    return -1;
}

我们可以明显看到,当目标被锁定在一半区域内时,就剪掉另一半,并对所在的一半进行搜索。而此时问题化简成为一个只有一半数据规模的子问题,递归这一过程,最终就可以在常数时间解决搜索问题。

另一个剪枝搜索的经典实例是寻找一组数中第K小的数的值,直观的想法是进行一次排序,而后求解。但即使是使用最合适于此问题的堆排序,也要用到O(NlogN)的时间,实际上,利用剪枝搜索有一种O(n)时间的算法如下:

选取数组中一个数P,遍历数组,将所有数据与P比较,小于P的数字置于集合S1,等于P的数字置于集合S2,大于P的数字置于集合S3

若S1.size>K,舍弃S2,S3,以S1为基础重复此问题。

否则 若S1.size+S2.size>K,则P为第K个数的值。

否则 舍弃S1,S2,以S3为基础重复此问题。

代码以后补

 

对于剪枝搜索问题的复杂度,我们可以看到

T(n)=T((1-f)*n)+O(n^k),最终的复杂度取决于k即为O(n^k),当n趋于无穷时,解决问题的实质复杂度和解决子问题的复杂度趋于一致。

(例如,对于Binary Search,T(n)=T(n/2)+C

设n=2^k,则有T(2^k)=T(2^(k-1))+C=(T(2^(k-2))+C)+C=T(1)+k*C

即T(n)=log(n)*C+T(1),所以binary search是一个O(log(n))的算法,在n趋于无穷时log(n)趋于常数代价)

 

转载于:https://www.cnblogs.com/cielosun/p/5657751.html

### Python 中实现剪枝搜索算法 在Python中,剪枝技术用于减少不必要的计算路径,从而提高搜索效率。对于子集求和问题,可以通过提前终止不必要分支来加速查找过程。 下面是一个改进后的子集求和函数,其中加入了更有效的剪枝策略: ```python def optimized_subset_sum(numbers, target, partial=[], start_index=0): current_sum = sum(partial) # 如果当前部分解已经等于目标,则打印并返回 if current_sum == target: print(f"找到一个符合条件的子集: {partial}") # 当前总和超过目标值时停止进一步探索该路径 elif current_sum > target or start_index >= len(numbers): return else: # 尝试加入下一个数到当前组合中继续尝试 for i in range(start_index, len(numbers)): n = numbers[i] # 对数组进行预处理可以更好地利用单调性来进行剪枝操作 if current_sum + n <= target: optimized_subset_sum( numbers, target, partial + [n], i + 1 # 防止重复使用相同位置上的元素 ) # 测试数据 numbers_list = [3, 9, 8, 4, 5, 7, 10] target_value = 15 optimized_subset_sum(numbers_list, target_value) ``` 在这个版本里增加了`start_index`参数控制遍历起始点,并且只当新加入数值不会使累积超出目标才进入更深一层递归调用[^2]。 为了进一步提升性能,在实际应用中还可以考虑先对输入列表按升序排列以便尽早触发剪枝条件;另外也可以引入记忆化机制避免多次访问相同的节点状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值