【0】README
1)本文旨在review 算法分析的几个算法问题 附带源码;
【1】最大子序列和问题的解(两种解法——分治法+联机算法(推荐))
【1.1】分治法
1)intro:其思想是把问题分成两个大致相等的子问题,然后递归地对它们进行求解,这是“分”部分;“治”阶段 将两个子问题的 解合并到一起并可能再做些少量的附加工作,最后得到整个问题的解;
2)算法idea 描述:在我们的例子中(求最大子序列和的问题),最大子序列和可能出现在三个地方——或者整个出现在输入数据的左半部、或者整个出现在
右半部、或者跨越输入数据的中部从而占据左右两半部分;
3)如何求其解呢?  前两种情况,可以递归求解,第3种情况的最大和可以通过求出前半部分的最大和(包含前半部分的最后一个元素)以及 后半部分的最大 和(包含后半部分的第一个元素)而得到。然后将这两个和加在一起;
4)算法流程演示和源码如下:
#include<stdio.h>#define ElementType intint max3(int i, int j, int k)
{if(i < j){i = j;}if(i < k){i = k;}return i;
}// compute the maximum sum of sebsequence.
// 3 in mxSubSum3 means 3 possibilities.
int maxSubSum3(int A[], int left, int right)
{int onlyLeftSum, onlyRightSum; // just only left or right sum without center.int centerLeftSum, centerRightSum; // the 3rd is passing center.int tempSum;int center, i;if(left==right){if(A[left] > 0){return A[left];}else{return 0;}}center = (left+right)/2;  onlyLeftSum = maxSubSum3(A, left, center);onlyRightSum = maxSubSum3(A, center + 1, right);centerLeftSum = 0;    tempSum = 0;    for(i=center; i>=left; i--) {   tempSum += A[i];if(tempSum > centerLeftSum){centerLeftSum = tempSum;}}centerRightSum = 0;tempSum = 0;for(i=center+1; i<=right; i++) { tempSum += A[i];if(tempSum > centerRightSum){centerRightSum = tempSum;}}printf("onlyLeftSum=%d, onlyRightSum=%d, centerLeftSum + centerRightSum=%d \n", onlyLeftSum, onlyRightSum, centerLeftSum + centerRightSum);return max3(onlyLeftSum, onlyRightSum, centerLeftSum + centerRightSum);
} int main()
{int N = 8, maxSum = 0;            ElementType A[] = {4, -3, 5, -2, -1, 2, 6, -2};        maxSum = maxSubSum3(A, 0, N-1);        printf("the maximum sum of array {4, -3, 5, -2, -1, 2, 6, -2} is: %d \n", maxSum);
}
【1.2】联机算法
1)intro:在任意时刻,算法对要操作的数据只需要读入一次,一旦被读入处理,它就不再需要被记忆了。而在处理过程中,算法对已读入的数据给出了正确的答案,具有这种特性的算法叫联机算法;
2)利用 联机算法求最大子序列和问题的解,源码如下(比 分治法效率高)
#include<stdio.h>#define ElementType int// 联机算法计算最大子序列和问题.
int maxSubSequenceSum(int A[], int N)
{int thisSum=0, maxSum=0;int j;    for(j = 0; j < N; j++) {thisSum += A[j];if(thisSum > maxSum){maxSum = thisSum;}else if(thisSum < 0){thisSum = 0;}}return maxSum;
}int main()
{int N = 8, maxSum = 0;            ElementType A[] = {4, -3, 5, -2, -1, 2, 6, -2};                    maxSum = maxSubSequenceSum(A, N);printf("the maximum sum of array  {4, -3, 5, -2, -1, 2, 6, -2} is %d \n", maxSum);    return 0;
}
【2】运行时间中的对数
【2.1】荔枝1——二分查找 
#include<stdio.h>#define ElementType int
#define NOTFOUND -1/* 二分查找,A[]升序排列 */
int binarySearch(ElementType A[], ElementType x, int N)
{int low, mid, high;low = 0;high = N - 1;while (low <= high){mid = (low + high) / 2;if(A[mid] < x){low = mid + 1;}else if(A[mid] > x){high = mid - 1; }else {return mid;}}return NOTFOUND;
} main()
{int A[]={4, 5, 67, 67, 109, 876};int N=6, x=109;        printf("\narray[] = {4, 5, 67, 67, 109, 876}");printf("\nthe position whose value equals to %d is %4d\n", x, binarySearch(A, x, N));
}
【2.1】荔枝2——计算最大公因数(欧几里得 算法)
#include<stdio.h>#define ElementType int
#define NOTFOUND -1/* 求两个数的最大公因数(greatest common divisor) */
int gcd(int M, int N)
{int rem;printf("remainder sequence: ");while (N > 0){rem = M % N;M = N;N = rem;printf("%4d", rem);}return M;
}main()
{int N = 1989, M = 1590;    int gcd_value;printf("\t\t\t ========== test for greatest common divisor ==========\n\n");    gcd_value = gcd(M, N);printf("\nthe greatest common divisor between %4d and %4d is %4d\n", M, N, gcd_value);}
【2.1】荔枝3——高效率的幂运算
1)减少乘法次数:如 X^62 只用到了9次乘法:
X^3=(X^2)*X , X^7=(X^3)^2*X , X^15=(X^7)^2*X , X^31=(X^15)^2*X , X^62=(X^31)^2
2 + 2 + 2 + 2 + 1 == 9次; 
#include<stdio.h>int isEven(int N)
{return N % 2 == 0 ? 1 : 0;
}int pow(int x, int N)
{if(N == 0){return 1;}else if(N == 1){return x;}else if(isEven(N))    /* if(x) == if(N!=0) */{return pow(x * x, N / 2);}else{return pow(x * x, N / 2) * x;}
}void main()
{int x = 2, N = 7;long pow_ = pow(x,N);printf("\t\t\t ========== test for computing pow  ==========\n");printf("\t\t\t result of %d^%d  is %-6d\n", x, N, pow_);
}

ReviewForJob(2)算法分析相关推荐

  1. ReviewForJob(1)数据结构与算法分析引论

    [1] 数学基础 1.1)本书将使用以下4个定义:    对上述定义的分析(Analysis):     - A1)第一个定义是说T(N)的增长率小于等于f(N)的增长率:     - A2)第二个定 ...

  2. 基于FCN,U-Net的深度学习医学影像分割算法(细胞分割算法)以及传统算法分析

    本博文主要分析了基于传统计算机视觉的细胞分割算法和基于深度学习的细胞分割算法.主要针对医学影像分割算法.包括了FCN全卷积网络的细胞分割效果,U-Net细胞分割效果.查阅了采用深度学习分割医学影像的几 ...

  3. Weiss的数据结构与算法分析(C++版)源码编译说明

    最近尝试编译Weiss的那本数据结构与算法分析(C++版)提供的源代码时,遇到一些问题,特记录如下: 考虑到该书提供的代码是使用模板技术较多,这在提供简洁代码的同时,也给源码的编译带来了一些问题.因而 ...

  4. 反汇编算法介绍和应用——递归下降算法分析

    上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法.本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法.(转载请指明来源于breaksof ...

  5. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  6. 总结:DCIC算法分析赛完整方案分享!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:阿水,北航计算机硕士,Datawhale成员 DCIC2020 本 ...

  7. 算法分析赛:从数据中挖掘价值,72万奖金,DCIC 2020 大数据赛道来了!

    01  DCIC 2020:数字中国创新大赛 DCIC 是国内赛事中少有的开放政府真实数据的经典赛事,除了高知名度,高影响力,高奖金,对能力履历,学术研究和企业技术应用都提供了很好的机会.作为数字中国 ...

  8. 线性排序算法分析总结

    线性排序(Linear sort),指的是 时间复杂度为 O(n) 的排序算法.之所以时间复杂度能达到线性,是因为这种排序不是基于比较的,但它的适用场景也有很大的局限性. 线性排序有三种:桶排序.计数 ...

  9. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

最新文章

  1. oc 协议 回调 静态成员_OC底层原理探究:Category、关联对象和block本质
  2. 苹果损失超 1000 万美元,前员工被控收回扣、盗窃、欺诈!
  3. linux下配置tomcat、resin
  4. 《Python程序设计》教学大纲
  5. ktm390蓝牙连接安卓_蓝牙音乐AudioTrack Session ID的获取
  6. C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG
  7. linux查看执行过的命令行,在Linux命令终端中查看和编辑曾执行过的命令 – LINUX笔记 – CFEI.NET...
  8. Pythonseleniumtesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考
  9. java流意外结束_java – POI – null之后的文件意外结束
  10. 产品设计必备干货:产品开发流程[完整版]
  11. 3DMax基础入门教程,命令面板的设置简介以及功能
  12. retainAll()和removeAll()
  13. android应用程序开发宝典,android应用程序开发宝典.pdf
  14. JAVA垃圾回收器与垃圾回收算法
  15. win10 添加照片查看器
  16. 什么是外汇EA呢?工作的原理又是什么呢?送给不懂外汇EA
  17. [SSL_CHX][2021-8-18]条件输出4
  18. 华为c8815手机在开发Android调试时logcat不显示输出信息的解决办法
  19. 实验室工作站配置多用户远程连接教程(亲测有效版)
  20. element修改el-table 表头的背景颜色横向渐变色 + 修改表头背景颜色

热门文章

  1. Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律
  2. 牛客题霸 [判断一个链表是否为回文结构] C++题解/答案
  3. 牛客题霸 判断链表中是否有环 C++题解/答案
  4. CodeForces 1361E James and the Chase(dfs + 结论)
  5. 阶段总结:8.09-8.18 十日模拟
  6. 震惊!递推与递归竟然可以这么编!%99的程序员都不知道!
  7. YbtOJ#903-染色方案【拉格朗日插值,NTT,分治】
  8. P3857-[TJOI2008]彩灯【线性基】
  9. jzoj3463-军训【双重嵌套二分,随机数据水法】
  10. jzoj1164-求和【欧拉函数,数论】(筛欧拉函数模板)