#yyds干货盘点# 查找算法——抽签算法(或称为最优秀算法别顶要脸)

Posted ZS_Jie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 查找算法——抽签算法(或称为最优秀算法别顶要脸)相关的知识,希望对你有一定的参考价值。

抽签算法的基本思想

抽签是中国的民间习俗,是占卜的其中一种形式。那么可以抽签的形式随机找出序列中的元素进行比对,如果运气足够好,那么不管多少元素,都只需要比对一次,这就是这个算法最神秘之处,用阳寿来查找。

步骤

  1. 产生一个随机数 $randNum$
  2. 随机数对数组长度进行取余获取抽中元素的下标 $index=randNum%length$
  3. 与目标元素进行比较,如果不相等,则重复1、2;直至找到

过程演示

在序列 $[3,44,38,5,47,15,36,26,1,2]$ 中查找 2

  1. 第一种结果:查找 1 次

  2. 第二种结果:查找 18 次

  3. 第三种结果:查找 3 次

算法代码

```c++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

//抽签算法
void DrawAlgorithm(int nums[],int num,int n){
srand((int)time(0)); //产生随机种子
int count=0,randNum,bound=n*n;
while(true&&count<bound){ //当寻找次数到达 bound 时停止
count++;
randNum=rand()%n; //生成随机数
if(nums[randNum]==num){
break; //如果找到 num,则 break 退出循环
}
}
cout<<"已找到 "<<num<<",寻找次数 count:"<<count;
}

//打印数组
void printNum(int numbers[],int n){
for(int i=0;i<n;i++){
cout<<numbers[i]<<" ";
}
cout<<endl;
}

int main()
{
int numbers[10]={3,44,38,5,47,15,36,26,1,2};
int n=sizeof(numbers)/sizeof(numbers[0]); //数组长度
cout<<"序列为:";
printNum(numbers,n); //打印数组
DrawAlgorithm(numbers,2,n); //调用 DrawAlgorithm 函数在 numbers 序列中进行抽签查找 2
return 0;
}



**算法性能分析**

- 空间复杂度:$O(1)$
- 时间复杂度
  - 最好情况下时间复杂度:$O(1)$
  - 最坏情况下时间复杂度:不确定

以上是关于#yyds干货盘点# 查找算法——抽签算法(或称为最优秀算法别顶要脸)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#哈希算法和多种加密算法综合使用

#yyds干货盘点# leetcode算法题:在排序数组中查找元素的第一个和最后一个位置

#yyds干货盘点# leetcode算法题:最长公共前缀

#yyds干货盘点#看动画学算法之:hashtable

#yyds干货盘点#剑指 Offer 04. 二维数组中的查找

#yyds干货盘点# 数据结构与算法之时间复杂度与空间复杂度