算法入门之优化枚举(一) 思路介绍和部分工具
首先呢,博主并不是什么大神。博主觉得在复习和学习的过程中需要给自己留下点知识和财富,所以决定开始总结一些知识点 包括汇编、C、java、web框架、Python等。 这个分类主要记录和总结算法知识
这篇主要介绍暴力枚举的思路及部分工具
上图是一个网上的算法题,值得注意的是数据范围,很多正规的编程比赛都会注明数据范围。
最后一部分是时间和内存限制。现在主流的服务器据说是10^8数量级。
枚举算法:
设计一个枚举算法的关键 1 关键在于确定枚举的变量
2 确定枚举的范围。
常用思路
1 二分法 算法复杂度通常由o(N)----->o(logN)
2 Hash 空间换时间
3 前缀和后缀和
4 双指针 主要呢都是空间换时间的方法
(1)确定枚举的变量
这是一道某比赛国赛题目 是一个填空题显然是个水题.........简单的通过暴力就可以得到结果,那么它的枚举该如何设计呢。
首先枚举【1026753849,9876543210】 不过他的复杂度大概是10^10级以上的。
这时候稍微优化一下,改成枚举数字的平方根A是多少即可。所以枚举【30000,100000】 计算x=A*A 然后判断x是不是0-9是不是10位数字。 此时枚举算法10^ 5 判断还有一个o(10)所以优化了很多
2 查找一个元素是不是存在
这也是一个常见的问题 要解决这样的问题,哈希表是一个非常好用的工具。而且更方便的是,C++的STL已经帮我们把这些工具都实现好了,提供了非常方便的接口,我们直接用行了。下面我们就介绍一下这些工具。
首先我们要介绍的就是unordered_set和unordered_map。unordered_set可以把它想象成一个集合,它提供了几个函数让我们可以增删查:
unordered_set::insert
unordered_set::find
unordered_set::erase
unordered_map同样也提供了增删查函数:
unordered_map::insert
unordered_map::find
unordered_map::erase
这三个函数的平均时间复杂度也是O(1)的
这样会使程序的操作更加简单
普通set/map的用法其实和unordered_set/map是一样的 其中set/map不一样的地方是它们内部是用平衡树实现的。所以insert/find/erase操作时间复杂度都是O(logN)的。这里N指容器中有多少个元素。不过O(logN)这个复杂度已经很优秀了