程序中的“哨兵”指的是什么?
“哨兵”指的是一种含有特殊值的数据,可用于标识数据的结尾等。字符串的末尾用0表示,链表的末尾用-1表示。
程序是用来在计算机上实现现实世界中的业务和娱乐活动的。为了达到个目标,程序员需要结合计算机的特性,用程序来表示现实世界中对问题的处理步骤,这个过程就称为算法。
![146382b7c8917a4a7d46d08b8a4f5780.png](https://i-blog.csdnimg.cn/blog_migrate/c0442a1c1384a30f963f6aa036801123.jpeg)
算法是程序设计的“熟语”
学会编程语言和学习外语很像。为了将自己的想法完整地传达给对方,仅仅死记硬背单词和语法是不够的,只有学会了对话中常用的熟语,才能流利地对话。
仅仅囫囵吞枣地把关键词和语法记下来,是无法流利地和计算机对话的,可是一旦了解了算法就能将自己的想法完整地传达给计算机了。因为算法就相当于程序设计中的熟语。
只要理清现实世界解决问题的步骤,再结合计算机的特性,就一定能想出算法。
要点1:算法中解决问题的步骤是明确有限的
用通俗的话来说,算法就是“把解决问题的步骤无一遗漏的用文字或图表达出来”,把这里的“用文字或图”替换为“用编程语言表达”,算法就变成程序了。
要点2:计算机不靠直觉而是机械地解决问题
计算机不能自发的思考。因此计算机所执行的由程序表示的算法必须由机械的步骤所构成。所谓“机械的步骤”,就是不用动任何脑筋,只要按照这个步骤做就一定能完成的意思。
众多的学者和前辈程序员已经发明了很多机械地解决问题的步骤,这些步骤并不依赖人类的直觉。由此构成的算法被称为典型算法。
![9beb66f027cecf154e382b5918cb7190.png](https://i-blog.csdnimg.cn/blog_migrate/af3e517b748db61246ad422c4115f01c.jpeg)
要点3:了解并应用典型算法
虽然算法应该由诸位自己思考,但是如果遇到了不知道从哪下手才好的问题,也可以利用这类辞典查查已经发明出来的算法。一来提高自己的能力,二来提高开发效率。
主要的典型算法有:辗转相除法 -- 求解最大公约数;埃拉托斯特尼筛法 -- 判定素数;顺序查找 -- 检索数据;二分查找 -- 检索数据;哈希查找 -- 检索数据;冒泡排序 -- 数据排序;快速排序 -- 数据排序;
要点4:利用计算机的处理速度
无论是多么冗长繁琐的步骤,只要明确并且机械就能构成优秀的算法。诸位把算法用程序表示出来让计算机去执行,而计算机会用令人吃惊的速度为我们执行。
要点5:使用编程技巧提升程序执行速度
解决一个问题的算法未必只有一种。在考量用于解决同一个问题的多种算法的优劣时,可以认为转化为程序后,执行时间较短的算法更为优秀。虽然计算机的处理速度快的惊人,但是当处理的数据数据值巨大或者数量繁多时还是要花费大量的时间。
在算法技巧中有个著名的技术叫做“哨兵”。这个技巧多用在线性搜索等算法中。线性搜索的基本过程是将若干个数据从头到尾,依次逐个比较,直到找到目标数据。
![08ad6a5cd8ae21520fae578a625fa39c.png](https://i-blog.csdnimg.cn/blog_migrate/ba924e3adc836e9960319d71d6566bc3.jpeg)
要点6:找到数字间的规律
所有的信息都可以用数据表示 -- 这是计算机的特性之一。因此为了构造算法,经常会利用到存在于数字间的规律。
要点7:先在纸上考虑算法
最后介绍最为重要的一点,那就是思考算法的时候,要先在纸上用文字或图表描述出解决问题的步骤,而不要立刻开始编写代码。
画流程图就可以方便地把算法用图表示出来,在纸上画完或写完流程以后,再把具体的数据代入以跟踪流程的处理,确认是否能够得到预期的结果。