扎实打牢数据结构算法根基,从此不怕算法面试系列之006 week01 02-06 循环不变量
Posted 忘记背后,努力面前;心定大志,壮马驰驱。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扎实打牢数据结构算法根基,从此不怕算法面试系列之006 week01 02-06 循环不变量相关的知识,希望对你有一定的参考价值。
循环不变量
1、循环开始时需要做什么?
之前我们讲的线性查找法的核心代码如下:
public static <E> int search(E [] data,E target)
for (int i = 0; i < data.length; i++)
if (data[i].equals(target))
return i;
return -1;
我们是否有思考过,这样一个简单的查找算法,用到了循环,但是每一轮循环开始前,需要满足的条件是什么?
其实,循环开始时,需要确认:
确认data[i]是否是目标
通过语句,if (data[i].equals(target))判断
循环体执行完一次时:
我们确认了data[i]不是目标,换句话,即:data[0…i]中没有找到目标。
注:方括号[]表示的时闭区间,圆括号()表示的是开区间。
闭区间包含开闭的元素,开区间不包含开闭的元素。
也可以半开半闭,即:(],或者[)。
即:data[0…i],也可以表示为data[0…i-1)
2、什么是循环不变量?
什么是循环不变量呢?
循环不变量定义:即每一轮循环开始时,循环都满足的性质或者条件。
3、循环不变量的作用
循环不变量的作用,其实如定义所讲,帮助我们厘清每一轮循环开始时循环所处的条件。有助于厘清算法实现的思路。
在循环中,循环体的作用,就是维持循环不变量。
循环体和循环不变量的关系,本身也是”证明“算法正确性的一种方式。
这里的”证明“用了引号,因为并不是严谨的数学证明。
其实,每次循环开始时,满足一个条件,
即:data[0……i-1]中没有找到目标。
总结重点:
写出正确的代码,需要定义清楚循环不变量,循环体的作用就是为了维持循环不变量。
再也不怕数据结构和算法之开篇
为什么要学习算法和数据结构
算法和数据结构是程序员的基本内功,基本内功修炼不好,以后修炼一些招式,如设计模式、架构,新的技术热点如区块链,新的技术语言go等,都会感觉非常吃力。
喜欢看武侠小说的知道,张无忌正是因为内功精纯,再加乾坤大挪移加持,学习任何武功招式都如探囊取物,短时间内即可融汇贯通。程序员的内功-数据结构和算法,乾坤大挪移-设计模式。
说实话,作为一个渣渣程序员,非CS专业出身,基础本就比较薄弱。正好借着写文章的机会,把数据结构和算法及设计模式都系统的学习一遍,并且把这些以比较容易理解的形式表达出来,授人以渔,同时自己也能理解的更透彻,何乐而不为。
扯的好像有点远了,言归正传,为什么要学习数据结构和算法,我觉得有以下几个主要原因:
- 应对技术面试,面过广大的程序员们,通过层层简历筛选,然后技术面试,大家的项目经历各部相同,很难深入挖掘,那怎么甄别候选人的技术能力呢?最简单也是最直接有效的方式当然就是考考你数据结构和算法咯。
- 程序员成长之路的基石,如同高楼大厦的地基,在有了良好的数据结构和算法的基础之上,程序员的学习能力和成长潜力才更大,以后才能走的更高更远。
- 面对一些问题,根据已有的数据结构和算法经验,能够设计出比较优雅及高效的解决方法。分析和解决问题的能力也会比数据结构和算法薄弱的同学更强。随着经验的慢慢积累,可以不断的设计、实现高性能系统,向着开源代码作者和架构师之路迈进。
数据结构和算法真这么重要吗?
为什么程序员被称为码农呢?大家都知道,越是大公司,分工越精细,每个人几乎都是一颗可以随时替代的螺丝钉。每天的工作也无非就是在原有的系统之上,做一些bug修复,一些小的功能点迭代。涉及到的编码无非是一些curd操作,尤其是现在在一些优秀的框架之下,程序员的编程几乎是傻瓜式的。
那怎么才能体现你的价值?告别curd boy呢?
连一些基本的数据结构和算法都掌握不了,一些普通的算法题解法都不会,你怎么能在这近百万的程序员之中脱颖而出呢?任何群体都如金字塔,处于塔尖的人很少,不能掌握好数据结构和算法,那你就基本只能处于程序员金字塔的最底端。
任何公司,都会有一些技术讨论吧!有时候技术leader拉你们一起讨论一些问题,人家说这很简单嘛,就是背包问题,或者这个用dfs算法不就ok了嘛,你如果连这些都听不懂,那是不是觉得自己很low,根本无法同别人沟通交流。更别提在技术方面有一些自己的独到见解了,也就无从谈起去一些公开场合分享自己的观点。
世界天天在变,技术热点千变万化,但是处于最基础的数据结构和算法确是处于基本不变的。学好了数据结构和算法,你就能够很云淡风轻的笑傲不断变化的新技术及新趋势,额,这归根到底不还说xx算法么,就是封装了一下而已,在数据结构和算法的基石之上,不断提升自己的思维、逻辑分析、抽象总结能力,那你就是一个越来越逼格的程序员了。
怎么学习数据结构和算法呢?
终于到了最重要的时刻,前面废了半天话,无非是想打动你这颗如顽石般的心,让你觉得学数据结构和算法好像很有用哦,那我是应该好好学啊。如果你意识到这一点,并觉得有时候面试算法对自己像是一种折磨和煎熬,又或者感觉好像自己从来就没掌握过数据结构和算法,那么恭喜你,咱们接下来可以一起学习进步了。
怎么学呢?
看到这篇文章的估计大部分已经是大学生或者已经参加工作了吧,相信你在这么多年的不断打怪升级中,总结了不少学习方法吧?在这里,我分享一下我的学习经历。
我基础比较薄弱嘛,曾经好几次发誓要学好数据结构和算法,买了书,买了课程,每次都是看完数组和链表,顶多到了递归,后面就坚持不下去了,觉得真是太难了,跟天书一般,这都是谁设计的啊。
我觉得可能90%的人都有跟我类似的经历,人本身惰性比较强,遇到挫折容易找自我安慰,但是我们真的甘心堕落吗?真的想一辈子当一个底层curd boy?从来没想过多赚点钱,早点赢取白富美,走上人生巅峰?
咳咳咳,心里想到白富美,是不是顿时感觉浑身充满了动力,白富美舍我其谁啊,那就好好跟我一起迈过数据结构这道坎(偷偷告诉你,其实是大家一起迈,我也没迈过去呢)。
- 数据结构和算法,先有数据结构,后有算法,首先要知道有哪些数据结构,每种数据结构是干啥的,怎么用,各有什么优缺点,分别适用于解决什么问题的场景。
- 多总结,多分析。任何事情,只要你不断分析总结,付出努力,总会慢慢收获的。一遍看不懂,那就看三遍,三遍不行,那就看五遍。今天看不懂,不代表以后看不懂,说不定某天就会豁然开朗。学习贵在坚持,总结,分析。
- 多动手,多练习,多刷题。纸上得来终觉浅,绝知此事要躬行。LeetCode应该是程序员们刷题最多的网站了,但我们也要刷题有道,不要为了刷题而刷题。所谓题海无涯,而学有涯,要掌握题目的本质,解决问题的思路,而不是沉浸在大量的、枯燥的题海战术上。
数据结构和算法的知识点
为了让你对数据结构和算法能有个全面的认识,这里借用小争哥的一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。
所谓按图索骥,哪里不懂学哪里,直到某一天,你闭上眼睛,这一幅脑包图可以完整的出现在你的脑子里,并且可以清晰的回忆起每个知识点,分别对应LeetCode上哪些典型题目及经典解法,和有哪些坑点,能总结出什么经验来,平时在项目中可能会怎么用到,那你就真的是学到了。
作为一名典型普通程序员,我也跟你一样,很懒。如果你觉得写的有点道理,并且想和我一起好好迈过数据结构和算法这道坎,记得点个??哦,如果能留言评论交流就更好了。
程序员之道,在无止境,扫码关注催更,一起无止境学习吧!
以上是关于扎实打牢数据结构算法根基,从此不怕算法面试系列之006 week01 02-06 循环不变量的主要内容,如果未能解决你的问题,请参考以下文章
扎实打牢数据结构算法根基,从此不怕算法面试系列之005 week01 02-05 使用自定义类测试我们前面实现的支持泛型的线性查找法
扎实打牢数据结构算法根基,从此不怕算法面试系列之007 week01 02-07 简单的复杂度分析