算法分析与设计——2.1.1改写的二分搜索算法

该博客介绍如何修改二分搜索算法,使其在元素不存在于已排序数组a[0:n-1]时,返回小于x的最大元素位置i和大于x的最小元素位置j。通过实例展示了代码实现和运行结果。

问题描述:设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,

返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

代码实现:

#include<iostream>
using namespace std;
int b[2] = { 0,0 };
template <typename Type>
int BinarySearch(Type a[], const Type x, int n)
{
	int left = 0, right = n - 1;
	int middle = 0;
	while (left <= right)
	{
		middle = (left + right) / 2;
		if (x == a[middle]) {
			return middle; break;
		}
		if (x > a[middle]) {
			left = middle + 1;
			b[0] = middle - 1;
			b[1] = middle;
		}
		else {
			right = middle - 1;
			b[0] =middle-1;
			b[1] = middle ;
		}
	}
	return -1;
}
int main()
{
	int a[10] = { 0,1,3,4,5,6,7,8,9,10 };
	int x = 2;
	int n = 10;
	int k=BinarySearch(a, x, n);
	cout << k << endl;
	cout << "i = " << b[0] << "  : " << "j = " << b[1] << endl;
	return 0;
}

运行结果:

 

### 贪心算法算法分析设计中的应用及案例 贪心算法是一种通过局部最优选择来逐步逼近全局最优解的算法设计策略[^1]。其核心在于选择合适的贪心策略,确保每次决策都能带来当前情况下的最佳结果。然而,贪心算法的应用需要满足两个基本要素:**贪心选择性质**和**最优子结构性质**[^2]。 #### 1. 贪心算法的基本要素 - **贪心选择性质**:一个全局最优解可以通过局部最优(即贪心)选择来达到。这意味着,在算法的每一步中,所做的选择都是当前看来最优的选择。 - **最优子结构性质**:问题的最优解包含其子问题的最优解。这一特性使得贪心算法能够通过解决子问题来构造整个问题的解。 #### 2. 典型案例 ##### 2.1 背包问题(物品可分割) 背包问题是一个经典的贪心算法应用场景。假一个容量为 \( C \) 的背包,以及 \( n \) 个物品,每个物品有重量 \( w_i \) 和价值 \( v_i \)。目标是最大化背包中物品的总价值,同时不超过背包的容量限制。 ###### 2.1.1 问题求解步骤 1. 计算每个物品的单位价值 \( \frac{v_i}{w_i} \)。 2. 按照单位价值从高到低对物品进行排。 3. 遍历排后的物品列表,尽可能多地装入当前物品,直到背包容量耗尽。 ```python def fractional_knapsack(capacity, weights, values): # 计算单位价值 items = [(values[i] / weights[i], weights[i], values[i]) for i in range(len(weights))] # 按单位价值降 items.sort(reverse=True, key=lambda x: x[0]) total_value = 0 for value_per_weight, weight, value in items: if capacity >= weight: capacity -= weight total_value += value else: total_value += capacity * value_per_weight break return total_value ``` 此实现展示了如何通过贪心选择逐步构造背包问题的解。 ##### 2.2 最优装载问题 最优装载问题的目标是在有限数量的容器中装载尽可能多的物品,每个物品具有一定的重量[^3]。假我们有一组物品和若干个固定容量的容器,目标是找到一种装载方案,使得所有物品都被装载且使用的容器数量最少。 ###### 2.2.1 贪心选择策略 按照物品重量从小到大的顺排列,并依次将每个物品放入第一个可以容纳它的容器中。如果所有容器都无法容纳当前物品,则新开一个容器[^3]。 ```python def optimal_loading(items, container_capacity): containers = [] items.sort() # 按重量升排列 for item in items: placed = False for container in containers: if container + item <= container_capacity: container += item placed = True break if not placed: containers.append(item) return len(containers), containers ``` #### 3. 贪心算法的局限性 尽管贪心算法在某些问题上表现优异,但它并非万能。例如,在0-1背包问题中,由于物品不可分割,贪心算法无法保证得到全局最优解。这是因为贪心算法的选择可能错过某些潜在的更优解。 #### 4. 总结 贪心算法算法分析设计中具有广泛的应用,尤其是在需要快速找到近似解的问题中。然而,使用贪心算法时必须严格证明其正确性,并注意其适用范围。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值