随笔分类 - 算法分析与设计
摘要:介绍 双指针是一种思想,一种技巧或一种方法,并不是什么特别具体的算法,在二分查找等算法中经常用到这个技巧。具体就是用两个变量动态存储两个或多个结点,来方便我们进行一些操作。通常用在线性的数据结构中,比如链表和数组,有时候也会用在图算法中。 在我们遇到像数组,链表这类数据结构的算法题目的时候,应该要想
阅读全文
摘要:红黑树 性质1. 结点是红色或黑色。 [3] 性质2. 根结点是黑色。 [3] 性质3. 所有叶子都是黑色。(叶子是NIL结点) [3] 性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点) 性质5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色
阅读全文
摘要:模拟退火与禁忌搜索对比 禁忌搜索采用的方法是朝最陡的方向爬上当前高峰,直到登上山顶(局部最优解),之后开始缓慢下山,同时寻找另一座山峰攀登(将局部最优的移动放入禁忌表,尝试将其他不在禁忌表中的移动进行相互替换);该方法的不足是花费大量时间攀爬(迭代)上遇得到的每一座山,而不是搜寻最高峰。 模拟退火采
阅读全文
摘要:setprecision: 控制输出浮点数的有效位 (与fixed一起用,保留n位小数) double a; cin>>a; cout << setprecision(5) << a << endl; 输入:12.345678 输出:12.345 double a; cin>>a; cout <<
阅读全文
摘要:有两类算法可以解决优化问题: 优化(算法):保证找到最佳解决方案(如果有足够的时间和资源) 是把各种可能性都一一进行尝试,最终能找到问题的答案,但它是在很大的问题空间内,花费大量 的时间和精力才能求得答案 启发式:不能保证找到最佳解决方案 在有限的搜索空间内,大大减少尝试的数量,能迅速地达到问题的解
阅读全文
摘要:二分法求 有序序列第一个满足某个条件的元素的位置的方法(模版): //二分区间为左闭右闭[left, right],初始值left、right必须覆盖解的所有可能 int solve(int left, int right){ int mid; while(left < right){ //对于[l
阅读全文
摘要:方法1: 时间复杂度:O(logn) n为二进制数的值 int n; int res=0; scanf("%d",&n); while(n!=0){ res+=(n&1); n>>=1; } printf("%d",res); 方法2: 时间复杂度:O(m) m为二进制数中1的个数 public c
阅读全文