如题:

在数组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. 离线环境安装nodejs及npm库i5ting_toc(超详细,手把手教学一通百通)

    一.离线环境先安装nodejs   1.在可联网的电脑上下载特定版本的 Node.js: 访问 Node.js 官方下载页面(https://nodejs.org/download/release/) ...

  2. autMan奥特曼机器人-对插件权限的管理

    为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...

  3. Azkaban - [01] 概述

    简单的任务调度使用crontab.复杂的任务调度使用oozie.azkaban等开发调度系统. 一.为什么学习Azkaban   一个完整的数据分析系统通常都是由大量任务单元(shell脚本.java ...

  4. k8s 手动更新 seldon core ca证书

    前言 seldon core 报错:x509: certificate has expired or is not yet valid: current time 这是因为 seldon core 默 ...

  5. HTTP/1.1、HTTP/2、HTTP/3

    HTTP/1.1 相比 HTTP/1.0 性能上的改进: 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销. 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来, ...

  6. nginx同时使用(http)80和(https)443端口详解

    server { listen 443 ssl; #监听https 443时需加ssl server_name ; #你的域名 ssl on; ssl_certificate ; #证书路径 ssl_ ...

  7. 视觉SLAM第四讲李群与李代数习题

    视觉SLAM第四讲李群与李代数习题 一.验证\(SO(3).SE(3).SIM(3)\)关于乘法成群 首先引入一下群的定义. 群 (Group) 是一种集合加上一种运算的代数结构.我们把集合记作 \( ...

  8. nacos(八): sentinel——基本使用

    一.概要 在微服务的架构中,流控是一个重要的任务.sentinel是阿里开源的流量治理组件,针对访问的"资源"或服务路径进行流控,内置了限流.熔断及系统负载保护等功能. senti ...

  9. while循环、dowhile循环、三种循环的区别

    1.while循环 案例:使用while循环,打印出水仙花数 while执行流程: 1.先执行初始化语句 2.执行判断条件 结果为true,则执行第3步 结果为false,循环结束 3.执行循环体语句 ...

  10. 【SpringCloud】Eureka服务注册与发现

    Eureka服务注册与发现 补充 Eureka基础知识 什么是服务治理 Spring Cloud封装了Netlix公司开发的Eureka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与 ...