数据结构与算法分析

  • 第一章 引论

    • 一些数学公式以及证明方法
  • 第二章 算法分析

    • 了解O,Ω,Θ与o在计算相对增长率上的含义

    • 分析程序运行时间的一般法则(一般用O表示):

    • 例子:求最大子序列和。采用分治的思想可以将程序运行时间降至O(NlogN);采用动态规划的思想可以将时间降至O(N)

      # 分治思想
      class Solution {
      public:
          struct Status{
              int lSum,rSum,mSum,iSum;
          };
      
          Status pushUp(Status lSub, Status rSub)
          {
              int iSum = lSub.iSum + rSub.iSum;
              int lSum = max(lSub.lSum, lSub.iSum + rSub.lSum);
              int rSum = max(rSub.rSum, rSub.iSum + lSub.rSum);
              int mSum = max(max(lSub.mSum, rSub.mSum), lSub.rSum + rSub.lSum);
              return (Status) {lSum, rSum, mSum, iSum};
          }
      
          Status get(vector<int>& a, int l, int r)
          {
              if(l == r)
                  return (Status) {a[l], a[l], a[l], a[l]};
                  
              int m = (l + r) >> 1;
              Status lSub = get(a, l, m);
              Status rSub = get(a, m + 1, r);
              return pushUp(lSub, rSub);
          }
      
          int maxSubArray(vector<int>& nums) {        
              return get(nums, 0, nums.size() - 1).mSum;
          }
          
      };
      
      # 动态规划
      class Solution {
      public:
          int maxSubArray(vector<int>& nums) {
              int pre = 0, maxAns = nums[0];
              for (const auto &x: nums) {
                  pre = max(pre + x, x);
                  maxAns = max(maxAns, pre);
              }
              return maxAns;
          }
      };
      
    • 例子:对分查找、欧几里得算法求最大公因数、幂运算

  • 第三章 表、栈、队列

posted on 2021-04-15 17:34  张芙蓉  阅读(496)  评论(0编辑  收藏  举报

导航