引入问题:
考虑一个计算函数值的问题:
你可以完全不用任何计算方法,先把函数值计算好(例如计算三角函数的值的那张表),把这些预先就计算好了的值存储于计算机中,当你需要这个函数值时,直
接去取就行了,当然这样的时间复杂度是O(1),因为你不需要任何计算,直接取出即可。(在计算机发明之前,事实上就是这样,类似于三角函数查表)
相对于其他再用别的算法来计算函数值的算法,它的时间复杂度是最好滴,它是最快滴。当然,你为时间最快付出了什么代价呢?空间!对,你需要一块空间来存
储这些值,而其他的算法不需要或者需要的空间少得多。
这就是时间和空间的考量,有时候需要拿时间换取空间,有时候需要拿空间换取时间。
在一些算法设计中,上面这个很简单的问题给了我们一些启示, 拿空间换取时间 !!!
--------------------------------------------------------------------------------------------------------------------------------------------------
1,按照上述问题的启发,我们有一种这样的方法,叫 输入增强 : 对部分或全部输入作预处理,获得额外的信息进行存储 ,以加速后面问题的求解。
简单的说,输入增强就是我们得到输入的时候,要不仅仅得到属于,还要对这个输入作一番处理和考察,得到它内在的更多信息,把它存起来:
1)计数排序
2)增强的字符串匹配算法:BM算法,KMP算法等都是基于这样的思想
2,另一种用空间换取时间的技术是 使用额外的空间来实现更快和更方便的数据存取 ,称为 预构造 :
1)散列法(hash表)
2)B树索引
3,还有一种空间换时间思想的技术:动态规划,将作为一门专门的算法设计技术在下一章讨论。
---------------------------------------------------------------------------------------------------------------------------------------------------
1,计数排序
思想很简单: 确定每个元素在数组中比它小的元素有多少个 ,实际就得到了每个元素的位置。若在数组A中,比元素x小的元素有2个,那么x应该是A的第三个元素即A[2]。2个循环就能得到每个元素比它小的元素有多少个,很简单,我们把这个信息存起来在另一个数组Count中,就可以根据Count的值得到它在A中的位置:
实现起来比较简单:
考虑一个计算函数值的问题:
你可以完全不用任何计算方法,先把函数值计算好(例如计算三角函数的值的那张表),把这些预先就计算好了的值存储于计算机中,当你需要这个函数值时,直
接去取就行了,当然这样的时间复杂度是O(1),因为你不需要任何计算,直接取出即可。(在计算机发明之前,事实上就是这样,类似于三角函数查表)
相对于其他再用别的算法来计算函数值的算法,它的时间复杂度是最好滴,它是最快滴。当然,你为时间最快付出了什么代价呢?空间!对,你需要一块空间来存
储这些值,而其他的算法不需要或者需要的空间少得多。
这就是时间和空间的考量,有时候需要拿时间换取空间,有时候需要拿空间换取时间。
在一些算法设计中,上面这个很简单的问题给了我们一些启示, 拿空间换取时间 !!!
--------------------------------------------------------------------------------------------------------------------------------------------------
1,按照上述问题的启发,我们有一种这样的方法,叫 输入增强 : 对部分或全部输入作预处理,获得额外的信息进行存储 ,以加速后面问题的求解。
简单的说,输入增强就是我们得到输入的时候,要不仅仅得到属于,还要对这个输入作一番处理和考察,得到它内在的更多信息,把它存起来:
1)计数排序
2)增强的字符串匹配算法:BM算法,KMP算法等都是基于这样的思想
2,另一种用空间换取时间的技术是 使用额外的空间来实现更快和更方便的数据存取 ,称为 预构造 :
1)散列法(hash表)
2)B树索引
3,还有一种空间换时间思想的技术:动态规划,将作为一门专门的算法设计技术在下一章讨论。
---------------------------------------------------------------------------------------------------------------------------------------------------
1,计数排序
思想很简单: 确定每个元素在数组中比它小的元素有多少个 ,实际就得到了每个元素的位置。若在数组A中,比元素x小的元素有2个,那么x应该是A的第三个元素即A[2]。2个循环就能得到每个元素比它小的元素有多少个,很简单,我们把这个信息存起来在另一个数组Count中,就可以根据Count的值得到它在A中的位置:
实现起来比较简单: