哨兵/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 ...
随机推荐
- Linux学习(1)- TCP/IP网络协议基础
Linux学习(1)- TCP/IP网络协议基础 一.TCP/IP 简介 学习内容 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输 ...
- Android SimpleAdapter ViewBinder
- Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
- python全栈学习1.开课介绍
python————web && 爬虫 Django pyramid Tornado Bottle Flask GUI图形开发 QT 想要类似于执行shell脚本一样执行python ...
- JVM的參數
博客:https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html#CMSInitiatingOccupancyFraction_v ...
- 11i - 12 Gather Schema Statistics fails with Ora-20001 errors after 11G database Upgrade (文档 ID 781813.1)
11i - 12 Gather Schema Statistics fails with Ora-20001 errors after 11G database Upgrade (文档 ID 7818 ...
- unigui session超时时间设置
unigui session超时时间设置 默认的SESSION超时时间是10分钟. 网络 SOCKET 程序,像 数据库,中间件,UNIGUI等...为了防止过多的僵死连接卡死服务端,服务端都会主动踢 ...
- 如何获取 docker 容器(container)的 ip 地址
1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...
- Azure DevOps Server 2019 (TFS)安装教程
概述 Azure DevOps Server 2019 (之前的名称为TFS),作为微软Azure DevOps 的企业私有(on-premises)服务器,是一个为开发团队提供软件协作开发管理的服务 ...
- JS学习笔记9_JSON
1.JSON概述 JavaScript Object Natation,js对象表示法,(像XML一样)是一种数据格式,它与js有相同的语法形式 P.S.一点小历史:JSON之父是道格拉斯,<J ...