|初学者指南:什么是算法?11行伪代码给你讲明白( 三 )


我们使用变量(variable)k指示当前跨度的长度——在我们的伪代码中 , 变量就是一个引用某些数据的名字 , 那些数据的内容 , 或者更精确地说 , 变量的值(value) , 在算法执行的过程中是可以改变的 , 变量这个术语因而得名 。 当我们开始计算一个跨度时 , k的值总是1 , 我们是在第3行设置这个初值的 。
我们还使用了一个指示变量(indicator variable)span_end 。 指示变量取值TRUE或FALSE , 指出某事成立或不成立 。 当我们到达一个跨度的末端时 , 变量span_end的值将为真 。
在开始计算每个跨度时 , span_end为假 , 如第4行所示 。 第5~9行的内层循环计算跨度的长度 。 第5行告诉我们 , 只要跨度还未结束 , 就回退尽可能长的时间 。 我们能回退多远由条件i-k≥0决定:回退到索引i-k指示的这一天检查跨度是否结束 , 而索引不能为0 , 因为0对应第1天 。
第6行检查跨度是否结束 。 如果跨度未结束 , 则在第7行增加其长度 。 否则 , 我们注意到 , 第9行设置跨度结束 , 从而循环会在回到第5行后终止 。
第2~10行的外层循环在第10行结束一次循环时 , 我们在此将k的值保存到数组spans的正确位置 。 在退出循环后的第11行 , 我们返回spans , 它保存着算法的结果 。
注意 , 初始时我们设定i=0和k=1 。 这意味着在最早的时刻第5行的条件必定为假 。 这是理所应当的 , 因为第0天的跨度只能为1 。
此时此刻 , 记住我们曾说过的关于算法、笔和纸的内容 。 理解一个算法的最好方法就是去手动执行它 。
在任何时候如果一个算法看起来有些复杂 , 或者你不确定是否已完全理解它 , 就用纸和笔写下执行它求解某个例子的过程 。 这种方法会节省你很多时间 , 虽然它看起来有点老套 。 如果对算法1-1还有不明确的地方 , 马上尝试这种方法 , 当算法已完全清晰后再回到这里 。
关于作者:帕诺斯·卢里达斯(Panos Louridas) , 曼彻斯特大学软件工程博士 , 现为雅典经济与商业大学管理科学与技术系副教授 。 在加入高校之前 , 曾在投资银行担任高级软件工程师 。
本文摘编自《真实世界的算法:初学者指南》 , 经出版方授权发布 。
|初学者指南:什么是算法?11行伪代码给你讲明白
本文插图

延伸阅读《真实世界的算法:初学者指南》
推荐语:学习算法的启蒙读本 , 算法尽量简单 , 避免读者有挫败感 , 仅需基本数学基础和计算机常识知识 。 通过真实世界需要解决的实际问题来介绍算法思想 , 为各领域高效运用算法提供重要指南 。


推荐阅读