首先了解算法复杂度
时间复杂度
时间复杂度与代码结构有着紧密的关系,对于输入数据量的代码运算次数就代表着时间复杂度
空间复杂度
空间复杂度则与数据结构的设计有关,复杂的数据结构会增加数据存储量,增加空间复杂度
然后开始解题
- 解题第一步 在不限制时间,空间的情况下,可以完成某个任务的代码的开发。这就是所谓的暴力解法,是程序优化的起点。
- 降低时间复杂度 降低时间复杂度,就是优化代码结构,也就是说优化你解题的思维。常用的降低时间复杂度方法有递归,二分法(查找响应元素的方法,二分法是线性表查找算法之一,还有字典结构查找),排序算法,动态规划等。
当你第一时间去寻找如何优化代码结构的时候,需要找到的代码里最耗时的数据操作,并思考有啥能替代的。在处理数据的时候,对于数据结构中的数据只有增删查,这三种操作。 在找出数据处理步骤中,时间复杂度最高的数据操作后,才能根据数据结构的知识,找到最合适的数据结构。 3. 用空间换时间 第三步,就是使用空间来换时间,连接时间和空间的桥梁就是数据结构,对于一个任务,如果能找到一种高效的数据组织方式,采用合理的数据结构,就能降低时间复杂度,但通常会增加数据存储量,增加空间复杂度。
接下来实战一下吧
找到一个数组中出现次数最多的元素
确认数据处理步骤
首先第一步,要根据输入数据统计每个元素出现的次数;然后第二步,根据第一步得到的结果,找到次数最多的元素。
具体数据操作
第一步中,外层需要遍历输入数组。然后内层中首先需要先遍历选择的数据结构,查找遍历的输入数组的元素是否在数据结构中出现过;然后,如果没有出现过,那么就加入这个元素,并且出现次数设为1;如果出现过,就将出现次数加1。
第二步,每个元素的出现次数统计完毕,需要对比这个数据结构中,每个元素的出现次数,找到最大的。
优化思路
优化代码结构可以吗?根据前面设计的操作,可用的优化貌似有二分查找,也可以在第二步中使用排序算法,然后得到最大出现次数。如果有对应解决问题的算法,那么也可以推翻之前的数据处理步骤,达到优化的目的。
但是用合适的代码结构能有更大的优化,用字典结构来存储元素以及对应的出现次数,能够在查找元素是否出现以及对应的次数上有着O(1)的时间复杂度。
总结一下
最后呢,总结一下如何解决一个算法问题。首先想着如何解决问题,有了问题的解法之后,想想有没有什么好的解题思维能用上(在解决问题前,也有可能直接想到这一思维,典型问题对应最优算法,可跳过暴力解法这一步),最后想想解法中用了哪些数据操作,这些数据操作能不能用更高效的空间结构去解决,大家也去试试吧。