哨兵线性搜索算法浅析与Python,C#实践Demo
如题:
在数组A[]
中搜索给定值foundNum
,其中length是A[]的长度
- 常规线性搜索
1.令索引i初始值为0,按次序依次赋值到n-1;
(a)如果A[i]==foundNum,返回当前i;
2.返回-1;代表没找到
在常规线性搜索的第1步实际有两个测试:一个是判断索引是否越界,二是判断是否与foundNum相等。也就是在遍历的时候,实际上每次都要判断一次是否越界。
- 哨兵线性搜索
针对常规线性搜索的每次都要判断越界的这个操作,我们可进行如下优化,首先将A[]
的最后一个元素改成foundNum,那么就“确保肯定能搜到”foundNum
值了,下面就可以只判断是否当前值与foundNum相等,如果不等,就“无脑”增加索引值,而避开了判断索引是否越界的这个操作,那么,还有个问题,就是万一最后一个值恰好就是foundNum,该如何处理,很简单,现在就只需要一次判断最后一个值 是否就是foundNum就可以了。最后根据i<n-1或者A[n-1]==foundNum来给出结果,如果这两个条件都不满足,那么就返回-1,代表没找到。
1.将A[length-1]的值保存在last中,令A[length-1]=foundNum;
2.i赋值为0;
3.只要A[i]!=foundNum,就自增i;
4.否则,A[length-1]重新赋值为last
5.如果i<length-1 或者A[length-1]==foundNum,返回i
否则,返回-1,代表没找到
C#代码进行验证:
class Program
{
public static void Main()
{
long max = 1000000000;
int result;
long[] a = new long[max];
for(long i = 0; i < a.Length; i++)
{
a[i] = i;
}
var stpw = new Stopwatch();
stpw.Start();
result=BetterLinearSearch(a,a.Length, max);
stpw.Stop();
Console.WriteLine("BetterLinearSearch result:{0},time:{1}", result, stpw.ElapsedMilliseconds);
var stpw0 = new Stopwatch();
stpw0.Start();
result = SentinelLinearSearch(a,a.Length, max);
stpw0.Stop();
Console.WriteLine("SentinelLinearSearch result:{0},time:{1}", result, stpw0.ElapsedMilliseconds);
}
public static int BetterLinearSearch(long[] a,int length,long foundNum)
{
for(int i = 0; i < length; i++)
{
if (a[i] == foundNum) return i;
}
return -1;
}
public static int SentinelLinearSearch(long[] a,int length,long foundNum)
{
var last = a[length-1];
a[length-1] = foundNum;
int i = 0;
do
{
if (a[i] != foundNum)
{
i += 1;
}
else
{
a[length-1] = last;
if (i < length-1 || a[length-1] == foundNum) return i;
else return -1;
}
}
while (true);
}
}
python代码进行实践:
import time
max=100000000
a=list(range(max))
def linearSearch(a,num,findNum):
i=0
while(i<len(a)): #不用 for i in range(len(a)) 是因为python中的for并没有索引递增
#然后判断是否越界,而是直接在容器/迭代器中进行遍历
if(a[i]==findNum):
return i;
else:
i+=1;
return -1;
def sentinelLineSearch(a,num,findNum):
last=a[-1]
a[-1]=findNum
i=0
while(True):
if(a[i]!=findNum):
i+=1
else:
a[-1]=last
if(i<(num-1) or a[num-1]==findNum):
return i
else:
return -1
tim=time.time()
b=linearSearch(a,len(a),len(a))
print("LinearSearch result is {0}, time is {1}".format(b,time.time()-tim))
tim=time.time()
b=sentinelLineSearch(a,len(a),len(a))
print("SentinelLinearSearch result is {0},time is {1}".format(b,time.time()-tim))
实际代码也确实验证了哨兵线性搜索算法比常规线性搜索算法更高效些。
哨兵线性搜索算法浅析与Python,C#实践Demo的更多相关文章
- python 最佳实践与资源汇总
python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...
- Python入门经典. 以解决计算问题为导向的Python编程实践
Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...
- C++ 线性搜索算法演示的代码
将做工程过程中比较好的内容做个备份,下边代码段是关于C++ 线性搜索算法演示的代码. #include<iostream>#include<conio> int linears ...
- Python 最佳实践指南 2018 学习笔记
基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...
- PYTHON 最佳实践指南(转)
add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...
- 机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码
机器学习是近年来渐趋热门的一个领域,同时Python 语言经过一段时间的发展也已逐渐成为主流的编程语言之一.<Python机器学习实践指南>结合了机器学习和Python 语言两个热门的领域 ...
- Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集
Python机器学习实践指南 目 录 第1章Python机器学习的生态系统 1 1.1 数据科学/机器学习的工作 流程 2 1.1.1 获取 2 1.1.2 检查和探索 2 1.1.3 清理和准备 3 ...
- <读书笔记>001-以解决问题为导向的python编程实践
以解决问题为导向的python编程实践 0.第0章:计算机科学 思考:计算机科学是否为计算机编程的简称? 编程的困难点:1.同时做2件事(编程语言的语法.语义+利用其解决问题) 2.什么是好程序(解 ...
- RPi 2B python opencv camera demo example
/************************************************************************************** * RPi 2B pyt ...
- Python机器学习实践与Kaggle实战(转)
https://mlnote.wordpress.com/2015/12/16/python%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%B7%B5 ...
随机推荐
- kalibr标定单相机,自用指南,防忘记
1. 标定环境 1.1 从源码编译(linux环境,建议ubuntu 18或20) 步骤见 kalibr wiki 1.2 Docker 如果实体机为Ubuntu,则见official docker ...
- docker - [11] 数据卷之DockerFile
通过DockerFile可以生成一个镜像 一.DockerFile的介绍 狂神:dockerfile是用来构建docker镜像的文件命令参数脚本. 狂神:dockerfile是面向开发的,我们以后要发 ...
- FastAPI 路径参数完全指南:从基础到高级校验实战 🚀
title: FastAPI 路径参数完全指南:从基础到高级校验实战 date: 2025/3/5 updated: 2025/3/5 author: cmdragon excerpt: 探讨 Fas ...
- 性能对比实验折线图绘制代码(YOLO系列为例)
本文用于绘制性能折线图,适用于对比实验,发现很多博文都是收费,欺负哥们懒得学习,一气之下ai了一下再进行代码修改,免费供给大家学习参考,便于大家撰写论文数据时利于绘制图像. import pandas ...
- 【 Python 】补全fibersim 导出的xml语法
fibersim导出的xml文件中,node 和mesh部分的标签会缺失.即<R></R>变成了<R/>. 以下python脚本可以自动修正 # ********* ...
- python excel 读取:如何读取符合多个条件的记录【出差、外出、调休、年假】
if 语句结合or 实现:读取所有出差.外出.调休.年假的记录 if '出差' in str(c_cell) or '外出' in str(c_cell) or'调休' in str(c_cell) ...
- 基础指令:grep、wc、管道符( | )、head、tail、less、more、sort、uniq、Linux软件安装、重定向及
目录 3.0 dd读取.转换并输出数据 3.1 压缩 (tar.zip).解压缩(tar xf.unzip) 3.2 ln软硬链接 3.2.1 软链接: 3.2.2 硬链接: 3.3 find文件查找 ...
- Camel多智能体框架初探
Camel介绍 CAMEL 是一个开源社区,致力于探索代理的扩展规律.我们相信,在大规模研究这些代理可以提供对其行为.能力和潜在风险的宝贵见解.为了促进该领域的研究,我们实现了并支持各种类型的代理.任 ...
- 手把手教你安装TrueNas(基础篇)
玩过蜗牛星际,体验过黑群晖系统崩掉导致里面珍藏12t大姐姐全没了(此处有哭声),我技术又菜,自己恢复是不可能恢复的,装的盗版系统,又不可能联系群晖官方售后恢复.于是乎就想要一个稳定.开 ...
- IIS7配置301永久重定向
我把我的小域名www.taadis.com301永久重定向到taadis.com. 关键图解: