lower_bound upper_bound源代码,以及小于等于关键词最大的数的位置

本文介绍了C++中lower_bound和upper_bound函数的源代码及应用,这两个函数基于二分查找,分别找到大于等于目标值的最小元素和大于目标值的最小元素。同时,讲解了如何利用upper_bound找到小于等于特定值k的最大值位置,注意处理边界情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:本质上都是二分查找,这就意味着一定要是先排好顺序的。注意:都只能对整个数组进行二分查找

时间复杂度:O(logn)

1.lower_bound返回值为大于等于key的最小的值

源码如下:

//接口:排好序的数组的首地址(且只能是首地址),数组的大小size(不是位置),以及要比较的关键词
//返回大于等于k的最小值,如果找不到,返回的值是size(n)
int lower_bound(int *array, int size, int key)
{
    //len表示元素的个数
    int first = 0, middle;//first表示一段区间的首地址
    int half, len;
    len = size;

    while(len > 0) {//len表示的是要寻找的区间的长度
        half = len >> 1;//右移1位除二
        middle = first + half;
        if(array[middle] < key) {//如果不在middle上,那么要在右面的区间上
            first = middle + 1;//不包括middle本身
            len = len-half-1; //其实当len为奇数时是多一位的,其实确实是没有影响的
        }
        else
            len = half; //first + half = middle 故是包括middle的
    }
    return first;
输出以下代码的结果 import numpy as np import random import math import matplotlib.pyplot as plt # 1. 目标函 (风险函) def f(x, y): """计算风险函的值""" return (x**2 + y**2 - 14*math.cos(x) - 14*math.cos(y)) # 2. 樽海鞘群算法 (SSA) class SSA: def __init__(self, dim, search_space, n_salps, max_iter): """ 初始化樽海鞘群算法。 Args: dim: 问题的维度 (在这里是 2,x y)。 search_space: 搜索空间 (list of tuples, 例如 [(-10, 10), (-10, 10)])。 n_salps: 樽海鞘的量。 max_iter: 最大迭代次。 """ self.dim = dim self.search_space = search_space self.n_salps = n_salps self.max_iter = max_iter self.salps_pos = self.initialize_salps() self.salps_fitness = self.evaluate_salps() self.food_pos = self.salps_pos[np.argmin(self.salps_fitness)].copy() #食物源位置 self.food_fitness = np.min(self.salps_fitness) #食物源适应度 def initialize_salps(self): """初始化樽海鞘的位置。""" salps_pos = np.zeros((self.n_salps, self.dim)) for i in range(self.n_salps): for j in range(self.dim): lower_bound, upper_bound = self.search_space[j] salps_pos[i, j] = random.uniform(lower_bound, upper_bound) return salps_pos def evaluate_salps(self): """评估樽海鞘的适应度。""" salps_fitness = np.zeros(self.n_salps) for i in range(self.n_salps): x, y = self.salps_pos[i] salps_fitness[i] = f(x, y) return salps_fitness def update_salps(self, current_iter): """更新樽海鞘的位置。""" # 计算控制参 c1 c1 = 2 * math.exp(-(4 * current_iter / self.max_iter)**2) for i in range(self.n_salps): if i == 0: # Leader 的位置更新 for j in range(self.dim): r1 = random.random() lower_bound, upper_bound = self.search_space[j] if r1 < 0.5: self.salps_pos[i, j] = self.food_pos[j] + c1 * (upper_bound - lower_bound) * random.random() + lower_bound else: self.salps_pos[i, j] = self.food_pos[j] - c1 * (upper_bound - lower_bound) * random.random() + lower_bound else: # Follower位置更新 self.salps_pos[i] = 0.5 * (self.salps_pos[i] + self.salps_pos[i - 1]) # 樽海鞘跟随链上的前一个樽海鞘 # 边界处理 (超出搜索空间的位置重置) for j in range(self.dim): lower_bound, upper_bound = self.search_space[j] self.salps_pos[i, j] = np.clip(self.salps_pos[i, j], lower_bound, upper_bound) # 确保位置在范围内 def optimize(self): """执行优化过程。""" best_fitness_history = [] # 存储每次迭代的最佳适应度 for iter in range(self.max_iter): self.update_salps(iter) self.salps_fitness = self.evaluate_salps() best_index = np.argmin(self.salps_fitness) if self.salps_fitness[best_index] < self.food_fitness: self.food_fitness = self.salps_fitness[best_index] self.food_pos = self.salps_pos[best_index].copy() best_fitness_history.append(self.food_fitness) if (iter+1) % 50 == 0: print(f"Iteration {iter+1}: Best Fitness = {self.food_fitness}, Best Position = {self.food_pos}") print("Optimization finished!") return self.food_pos, self.food_fitness, best_fitness_history # 3. 设置参 dim = 2 # 问题维度 (x, y) search_space = [(-10, 10), (-10, 10)] # x y 的搜索空间 n_salps = 30 # 樽海鞘量 max_iter = 500 # 最大迭代次 # 4. 创建 SSA 实例并运行优化 ssa = SSA(dim, search_space, n_salps, max_iter) best_pos, best_fitness, best_fitness_history = ssa.optimize() # 5. 绘制目标函变化情况 plt.plot(best_fitness_history) plt.xlabel("Iteration") plt.ylabel("Best Fitness (f(x, y))") plt.title("SSA Optimization Progress") plt.grid(True) plt.show() # 6. 输出结果 print("-----------------------------------------------------") print("Best x:", best_pos[0]) print("Best y:", best_pos[1]) print("Minimum f(x, y):", best_fitness)
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值