C语言二分搜索算法的实现与优化

版权申诉
0 下载量 192 浏览量 更新于2024-10-09 收藏 354KB RAR 举报
资源摘要信息:"二分搜索算法及其实现" 二分搜索是一种在有序数组中查找特定元素的高效算法。其基本思想是将待查找区间分为两半,判断目标值所在的区间,再对目标区间重复此操作,直到找到目标值或区间为空。 在VC(Visual C)环境下,二分搜索的实现涉及到基本的编程概念和操作,包括数组操作、循环控制、条件判断等。以下是二分搜索在VC中的实现要点: 1. 理解二分搜索的前提条件:输入数组必须是有序的,且通常为非递减顺序排列。如果是非递增排列,则需要相应调整比较的逻辑。 2. 实现二分搜索的伪代码如下: ```c int BinarySearch(int arr[], int l, int r, int x) { while (l <= r) { int m = l + (r - l) / 2; // 防止溢出 if (arr[m] == x) return m; // 找到目标值,返回其在数组中的索引 if (arr[m] < x) l = m + 1; // 调整搜索区间为右半部分 else r = m - 1; // 调整搜索区间为左半部分 } return -1; // 未找到目标值,返回-1 } ``` 在上述伪代码中,`arr`是待搜索的数组,`l`是搜索区间的左边界,`r`是搜索区间的右边界,`x`是需要查找的目标值。函数返回目标值在数组中的索引,如果未找到,则返回-1。 3. 循环条件:循环条件是`l <= r`,表示搜索区间至少还有一个元素需要检查。 4. 计算中间位置:为了避免在大数组中计算中间位置时发生整数溢出,使用`m = l + (r - l) / 2`来代替`(l + r) / 2`。 5. 边界调整:根据比较结果调整搜索区间的边界,如果目标值大于中间值,则调整左边界至中间值加1的位置;如果目标值小于中间值,则调整右边界至中间值减1的位置。 6. 递归与迭代:二分搜索可以通过递归或迭代两种方式实现。迭代方式通常更节省空间,但递归方式代码更简洁易懂。 7. 时间复杂度:二分搜索的时间复杂度为O(log n),其中n为数组长度,这使得二分搜索在大数据集上比线性搜索更快。 8. 二分搜索的局限性:如果数组没有排序,或者排序后无法快速获取中间值,那么二分搜索就不适用了。 9. 二分搜索在实际应用中的变种:例如查找第一个大于或等于目标值的元素,或查找最后一个小于或等于目标值的元素等,都需要对基本二分搜索逻辑进行适当的修改。 10. 注意事项:在实际编码时,需要确保输入数组是有序的,并且考虑边界条件和特殊情况(如空数组或只有一个元素的数组)。 通过上述知识点,可以看出二分搜索算法的实现不仅涉及到算法逻辑的掌握,还要求对编程语言提供的各种操作和控制结构有所理解。在VC环境下,掌握这些要点将有助于编写出高效的二分搜索代码。

#include "prepare_ogm.hpp" namespace senior { namespace guardian { namespace prepare { std::string PrepareOgm::Name() { return "Prepare Ogm Element"; } void PrepareOgm::Initiate() {} void PrepareOgm::Process(data::DataFrame& his, data::DataFrame& cur) { if (cur.source_ogm_points_.is_invalid()) return; if (cur.source_visual_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_visual_ogm_points_.begin(), cur.source_visual_ogm_points_.end()); } if (cur.source_higher_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_higher_ogm_points_.begin(), cur.source_higher_ogm_points_.end()); } auto& predict_path = cur.monitor_data_.mutable_predict_path(); predict_path.GenerateBoundary(cur); cur.AABox2d_ = predict_path.vehicle_AABox2d_; // if (!his.monitor_data_.is_need_to_take_over()) { // LOG(INFO)<<"1"; cur.AABox2d_.SetWidth(cur.AABox2d_.width() + 1.0); cur.AABox2d_.SetLength(cur.AABox2d_.length() + 1.0); // } std::vector<math::Vec2d> corner_points_; cur.AABox2d_.GetAllCorners(&corner_points_); auto& polygon2d = predict_path.tractor_polygon2d_; math::Vec2d temp; VoxelGrid filter_; common::Time now = common::Time::Now(); for (auto& point : cur.source_ogm_points_) { temp.set_x(point.x()); temp.set_y(-point.y()); if (cur.AABox2d_.IsPointIn(temp)) { cur.AABB_ogm_points_.emplace_back(point); } } cur.guardian_diagnose_["Prepare_PrepareOgm_AABox_filter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); now = common::Time::Now(); filter_.VoxelGrid_ApplyFilter( cur.AABB_ogm_points_, cur.ogm_points_, corner_points_, 0.1, 0.1, 0); cur.guardian_diagnose_["Prepare_PrepareOgm_VoxelGrid_ApplyFilter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); cur.ogm_points_.set_stamp(cur.source_ogm_points_.stamp()); cur.ogm_points_.set_time(cur.source_ogm_points_.time()); cur.ogm_points_.set_delay_time(cur.source_ogm_points_.delay_time()); cur.ogm_points_.set_valid(); } } // namespace prepare } // namespace guardian } // namespace senior 改变为C语言程序

2023-06-13 上传