哨兵/sentinel:在算法设计中的应用
哨兵(sentinel)
昨天看算法导论里对哨兵的描述后,觉得这是一种很有意思的编程思想。
哨兵是一个哑对象。一般哨兵不存放任何数据,但其结构体与其他有用的元素一致。
正如其字面意思,哨兵是在边界保卫祖国的军人,所以在编程的世界里,哨兵充当着简化边界条件处理的角色。
比较常见的应用是直接插入排序里的哨兵。
在直接插入排序里使用数组首位A[0]作为哨兵,这里的哨兵有两个作用:
1、暂时存放待插入的元素和防止数组下标越界。
2、简化了判断上的表达:循环头部的控制条件应为j>0与A[j]>t转化成比较一次:A[j]>A[0]
再比如算法导论里介绍的一个加上了哨兵的双向循环链表(书p238)。
在这个数据结构里,为了简化对边界条件的判断与维护,单独地生成一个结构对象与其他链表结点一致的结点,prev域指向表尾,next域指向表头。
正因为next域指向表头,在对链表处理的过程中可以省去头指针,直接用对哨兵的引用来代替对头指针的引用。
如图所示:(图自算法导论P238)

又比如扫雷游戏,每次点击一个格子就要扫描相邻的8个格子。当点击到边界的时候,相邻不足8个格子,这时候就可以在设计游戏的时候为边界外圈加上隐藏的一层格子。这样就可以使所有的操作一致化,不需要对边界的条件作出特殊的处理。
总结:
1、哨兵基本不能降低数据结构相关操作的渐近时间界,但其可以降低常数因子。
2、哨兵的设计可以使得代码更简洁,可以省去一些由于边界环境不同而作出的特殊处理。
3、在某些情况下哨兵可以使得循环语句更紧凑,降低运行时间里n或者n²项的系数。
4、慎用:哨兵会占用额外的内存。当使用哨兵的开销较大时,有可能会造成严重的浪费。
哨兵/sentinel:在算法设计中的应用的更多相关文章
- 【转载】FPGA算法设计随笔
FPGA设计算法依次需要完成MATLAB浮点仿真 MATLAB定点仿真 verilogHDL定点运算以及数据对比的流程.其中浮点到定点的转换尤为重要,需要在数据表示范围和精度之间做出权衡.另外掌握定点 ...
- 《PHP程序员面试笔试宝典》——如何回答算法设计问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中的很多算法设计问题,都是历年来各家企业的"炒现饭",不管求职者以前对算法知识掌握得是否扎 ...
- Redis | 第12章 Sentinel 哨兵模式《Redis设计与实现》
目录 前言 1. 启动并初始化 Sentinel 2. Sentinel 与服务器间的默认通信 2.1 获取主服务器信息 2.2 获取从服务器信息 2.3 向主服务器和从服务器发送信息 3. 接受来自 ...
- 架构设计:系统存储(24)——数据一致性与Paxos算法(中)
(接上文<架构设计:系统存储(23)--数据一致性与Paxos算法(上)>) 2-1-1. Prapare准备阶段 首先须要介绍几个在Acceptor角色上须要被持久化保存的数据属性: P ...
- 强化学习中REIINFORCE算法和AC算法在算法理论和实际代码设计中的区别
背景就不介绍了,REINFORCE算法和AC算法是强化学习中基于策略这类的基础算法,这两个算法的算法描述(伪代码)参见Sutton的reinforcement introduction(2nd). A ...
- Redis容灾部署(哨兵Sentinel)
Redis容灾部署(哨兵Sentinel) 哨兵的作用 1. 监控:监控主从是否正常2. 通知:出现问题时,可以通知相关人员3. 故障迁移:自动主从切换4. 统一的配置管理:连接者询问sentinel ...
- redis主从集群搭建及容灾部署(哨兵sentinel)
Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...
- Python数据结构与算法设计总结篇
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
随机推荐
- 为在python中使用dotnet程序安装clr
直接在命令行中录入 pip install pythonnet 会有一个ssl错误提示 ...Could not fetch URL https://pypi.python.org/simple/py ...
- 02:OC和C对比
1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...
- JVM可支持的最大线程数
转微博,因为他也是转载 不知道原出处 一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun J ...
- python函数知识
一.三目运算 也叫三元运算,例如result=x if x<y else y 二.集合(set) 返回主页集合(set):把不同的元素组成一起形成集合,是python基本的数据类型.集合元素(s ...
- 100度享乐电商网 html
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 冲刺博客NO.5
今天做了什么:布局UI和效果图,学会了监听事件并销毁监听接口 SMSSDK.unregisterAllEventHandler(); 今天做的东西不多,没有遇到什么苦难
- shell 中的 && 和 ||
shell 中的 && 和 || 简言之,shell 中 && --左边的命令执行成功才会执行右边的命令. || -- 左边的命令执行失败才会执行右边的命令.
- spring boot 整合 mybatis 以及原理
同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...
- VS2008 安装WINCE插件报错 ToolsMsmCA(Error)解决方案___VS2008
在win7系统,VS2008环境下安装EFMS9280_SDK.msi文件出现报错 ToolsMsmCA(Error):IHxFilters filter registration failure: ...
- QuartzNet使用
quartz.config # You can configure your scheduler in either <quartz> configuration section # or ...