|初学者指南:什么是算法?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) , 曼彻斯特大学软件工程博士 , 现为雅典经济与商业大学管理科学与技术系副教授 。 在加入高校之前 , 曾在投资银行担任高级软件工程师 。
本文摘编自《真实世界的算法:初学者指南》 , 经出版方授权发布 。
本文插图
延伸阅读《真实世界的算法:初学者指南》
推荐语:学习算法的启蒙读本 , 算法尽量简单 , 避免读者有挫败感 , 仅需基本数学基础和计算机常识知识 。 通过真实世界需要解决的实际问题来介绍算法思想 , 为各领域高效运用算法提供重要指南 。
推荐阅读
- 用户|什么叫数字化转型?
- 温枪|为什么测温枪一下子就能测出人体的温度?
- 广告位|商业化产品经理 | 在线广告(7): 设计一个广告位要考虑什么
- 互联网|同城跑腿配送生意好做吗?需要注意什么?
- 青年|34岁的人不想打工,在家做什么能一天收入300元?推荐一些
- 中年|Python编程语言有什么独特的优势呢?
- 科学|为什么没有人被暗物质杀死?
- 科学|既然所有的生命都要死亡,那么生命的意义是什么?
- 鲍跃忠新零售工作室|什么叫数字化转型?
- |又一巨头进军电竞!京东成立“京东电竞”,到底图什么?