当前位置: 首页 > web >正文

若干查找算法

一、顺序查找
1.原理
2.代码

#if 0
const int FindBySeq(const vector<int>& ListSeq, const int KeyData)
{int retrIdx = -1;int size = ListSeq.size();for(int i = 0; i < size; i++) {if (ListSeq.at(i) == KeyData){retrIdx = i;break;}}return retrIdx;
}
#else
const int FindBySeq(const vector<int>& ListSeq, const int KeyData)
{int retrIdx = -1;int size = std::size(ListSeq);//ListSeq.size()for (int item : ListSeq){if (item == KeyData){//查找item在vector中的位置vector<int>::const_iterator it = std::find(ListSeq.begin(), ListSeq.end(), item);retrIdx = std::distance(ListSeq.begin(), it);break;}}return retrIdx;
}
#endif

二、二分查找
1.算法
2.原理


//要求数据是升序的
const int binsearch(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = (low + high) / 2;//奇数,无论奇偶,有个值就行if (keyData < sortedSeq.at(mid)){high = mid - 1;//是mid-1,因为mid已经比较过了}else if (keyData > sortedSeq.at(mid)){low = mid + 1;}else{return mid;}}return -1;
}//要求数据是降序的
const int binsearchLess(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = (low + high) / 2;//奇数,无论奇偶,有个值就行if (keyData < sortedSeq.at(mid)){low = mid + 1;}else if (keyData > sortedSeq.at(mid)){high = mid - 1;}else{return mid;}}return -1;
}

三、插值查找
1.算法
2.原理

//要求序列是升序的
const int insertSearch(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = low + (keyData - sortedSeq[low]) / (sortedSeq[high] - sortedSeq[low]) * (high - low);if (keyData < sortedSeq[mid]){high = mid - 1;//是mid-1,因为mid已经比较过了}else if (keyData > sortedSeq[mid]){low = mid + 1;}else{return mid;}}return -1;
}

四、斐波那契查找
1.算法
2.原理


void Fibonacci(vector<int>& FibArr, const int len)
{int i;FibArr.push_back(1);FibArr.push_back(1);for (i = 2; i < len; ++i){FibArr.push_back(FibArr[i - 2] + FibArr[i - 1]);}
}//这里要求序列是升序的
//这个代码有bug
int Fibonacci_Search(vector<int>& sortedSeq, const int key)
{int n = std::size(sortedSeq);int i, low = 0, high = n - 1;int mid = 0;int k = 0;vector<int>F;Fibonacci(F, 20);while (n > F.at(k) - 1)          //计算出n在斐波那契中的数列  ++k;for (i = n; i < F.at(k) - 1; ++i) //把数组补全  {sortedSeq.push_back(sortedSeq.at(high));}while (low <= high){mid = low + F[k - 1] - 1;  //根据斐波那契数列进行黄金分割  if (sortedSeq.at(mid) > key){high = mid - 1;k = k - 1;}else if (sortedSeq.at(mid) < key){low = mid + 1;k = k - 2;}else{if (mid <= high) //如果为真则找到相应的位置  return mid;elsereturn -1;}}return 0;
}
http://www.xdnf.cn/news/2217.html

相关文章:

  • Vue3 组件通信与插槽
  • 未雨绸缪:应对软件开发变更的生存之道
  • 23种设计模式-行为型模式之观察者模式(Java版本)
  • 理想星环OS选择NuttX作为MCU侧OS的核心原因分析​
  • 树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率
  • ASP.NET CORE部署IIS的三种方式
  • 第14节:传统图像特征提取 - 形状特征(HOG、SIFT与SURF)
  • 【fork初体验】
  • 数据结构手撕--【堆】
  • 【LeetCode】11.盛最多水的容器
  • 系列位置效应——AI与思维模型【80】
  • 鸿蒙代码@Builder
  • 关于调度策略的系统性解析与物流机器人应用实践
  • Universal Value Function Approximators 论文阅读(强化学习,迁移?)
  • 介绍常用的退烧与消炎药
  • 【Flume 】Windows安装步骤、配置环境
  • Llama factory如何全参数微调 Qwen2.5-7B-Instruct 模型并导入Ollama推理(详细版)
  • 大一下第一次考核题解
  • Linux文件目录操作实战
  • 【C++】15. 模板进阶
  • 【含文档+PPT+源码】基于Python的美食数据的设计与实现
  • llama factory 命令行推理流程
  • MUC基本知识
  • 电子电器架构 --- 乘用车电气/电子架构开发的关键挑战与应对策略
  • Shell编程之正则表达式
  • c++弹窗
  • threejs 零基础学习day01
  • 【补题】Codeforces Global Round 20 F1. Array Shuffling
  • Python循环中断:break和continue,循环else语法,综合案例
  • 一、人类社会结构的根本逻辑