如题:

在数组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的更多相关文章

  1. python 最佳实践与资源汇总

    python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...

  2. Python入门经典. 以解决计算问题为导向的Python编程实践

    Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...

  3. C++ 线性搜索算法演示的代码

    将做工程过程中比较好的内容做个备份,下边代码段是关于C++ 线性搜索算法演示的代码. #include<iostream>#include<conio> int linears ...

  4. Python 最佳实践指南 2018 学习笔记

    基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...

  5. PYTHON 最佳实践指南(转)

    add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...

  6. 机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码

    机器学习是近年来渐趋热门的一个领域,同时Python 语言经过一段时间的发展也已逐渐成为主流的编程语言之一.<Python机器学习实践指南>结合了机器学习和Python 语言两个热门的领域 ...

  7. Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集

    Python机器学习实践指南 目 录 第1章Python机器学习的生态系统 1 1.1 数据科学/机器学习的工作 流程 2 1.1.1 获取 2 1.1.2 检查和探索 2 1.1.3 清理和准备 3 ...

  8. <读书笔记>001-以解决问题为导向的python编程实践

    以解决问题为导向的python编程实践 0.第0章:计算机科学 思考:计算机科学是否为计算机编程的简称? 编程的困难点:1.同时做2件事(编程语言的语法.语义+利用其解决问题)  2.什么是好程序(解 ...

  9. RPi 2B python opencv camera demo example

    /************************************************************************************** * RPi 2B pyt ...

  10. 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 ...

随机推荐

  1. 海康SDK报错Structure.getFieldOrder()

    就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了.比如 public static class NET_DVR_TIME ex ...

  2. Edge、谷歌浏览器默认下载器开启多线程下载

    浏览器默认下载器开启多线程下载 Chrome 浏览器,地址栏输入并回车: chrome://flags/#enable-parallel-downloading Edge 新版浏览器,地址栏输入并回车 ...

  3. Maven - 项目的JDK编译level是1.5,修改不掉??

    背景   idea中的maven项目,父项目和子项目的Project Structure的language level都是1.5,怎么修改为8?尝试修改并应用后会失效,还是会自动恢复为1.5. 1.S ...

  4. DeepSeek在M芯片Mac上本地化部署

    在 Mac 上使用 Ollama 运行 DeepSeek-R1,并通过 Open-WebUI 提供 Web 端访问. 1. 安装 Ollama Ollama官方:https://ollama.com/ ...

  5. VNCTF2025_Crypto

    VNCTF2025_Crypto Simple prediction task.py from random import shuffle from Crypto.Util.number import ...

  6. Docker swarm集群增加节点

    docker swarm初始化 docker swarm init docker swarm 增加节点 在已经初始化的机器上执行:# docker swarm join-token manager T ...

  7. [Winform]在Form里显示模态对话框ModalDialog

    问题 如何在WinForm的一个Form里面弹出一个模态Dialog? 背景 程序的框架是Winform,只有一个窗口MainForm.MainForm里面是一个TabControl,每个TabPag ...

  8. DELPHI 检测服务器地址是否有效

    利用DELPH 的ICMP控件检测服务器地址 function CheckNetServer():Boolean; begin IdIcmpClient1.Host := '192.168.1.230 ...

  9. 【SpringCloud】SpringCloud Sleuth分布式链路跟踪

    SpringCloud Sleuth分布式链路跟踪 概述 为什么会出现这个技术?需要解决哪些问题? 问题:在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后 ...

  10. 支付宝当面付和微信付款码支付封装DLL

    项目中需要为客户对接支付宝的当面付和微信付款码支付.场景就是软件中生成金额订单,然后扫顾客的微信付款码或者支付宝的付款码完成收款.为此封装了此DLL,可以用在其他项目中,其他人也可以直接拿来用. 最主 ...