ReviewForJob(2)算法分析

【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_);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java并行程序基础

1 进程 1 进程和线程之间的关系&#xff1a;进程是线程的容器。2 线程 1 线程的执行流程&#xff1a; **线程调用start(&#xff09;**方法时&#xff0c;表示线程开始执行&#xff1b;当线程执行时&#xff0c;处于RUNNABLE状态&#xff0c;表示线程所需的一切资源都准备好了…

ReviewForJob(3)表、栈和队列

【0】表ADT1&#xff09;intro&#xff1a;我们把 形如 A1, A2, A3, ..., An 的结构称为表&#xff1b;2&#xff09;表的实现&#xff1a; 数组&#xff08;循环数组&#xff09; 或 链表 或 双链表 或 循环链表实现&#xff1b;3&#xff09;表的插入&#xff0c;删除操作可以…

2017一季度JAVA面试题锦集

转载自 2017一季度JAVA面试题锦集 1、如何实现分布式事务&#xff0c;你们公司是怎么解决的&#xff1f; 2、HashMap数据结构及实现原理&#xff0c;其链表是用来解决什么问题的 3、可以自定义java.lang.String类吗&#xff0c;说明为什么 4、redis 1&#xff09;有哪几种类型的…

JDK并发包

JDK提供了大量实用的API和框架&#xff0c;来支持JDK内部功能&#xff1a; 介绍更多多线程控制方法&#xff0c;比如之前的synchronized&#xff1b;介绍JDK中对线程池的支持&#xff0c;提高线程调度性能&#xff1b;向大家介绍JDK的一些并发容器。 1 多线程的团队协作&…

ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列

【0】README 0&#xff09;希尔排序是基于插入排序的。将插入排序算法 内for循环中的所有 1 改为增量就可以。。bingo。。 插入排序源码 1&#xff09;本文旨在给出 希尔排序&#xff08;缩小增量排序&#xff09;之塞奇威克增量序列 的源码实现&#xff1b; 2&#xff09;为…

稍微有点难度的10道java面试题,你会几道?

转载自 稍微有点难度的10道java面试题&#xff0c;你会几道&#xff1f; 1、jvm对频繁调用的方法做了哪些优化&#xff1f; 2、常见的攻击手段有哪些&#xff1f;如何防范&#xff1f; 3、restful api有哪些设计原则&#xff1f; 4、hessian是做什么用的&#xff1f;它的…

重新学习Spring一--Spring在web项目中的启动过程

1 Spring 在web项目中的启动过程 Spring简介 Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系&#xff0c;实现高内聚、低耦合。&#xff08;高内聚&#xff1a;相关性很强的代码组成&#xff0c;既单一责任原则&#xff1b;低耦合&#xff1a;耦合指块间联系&…

ReviewForJob——堆排序

【0】README1&#xff09;本文旨在给出 推排序的源码实现&#xff1b;堆排序是基于二叉树的数组实现的&#xff1b;【1】堆排序步骤step1&#xff09;对排序数据建堆&#xff0c;执行 n 次 insert 操作&#xff08;基于上滤操作&#xff09;&#xff1b;每次 insert 包括 将 新…

重新学习Spring2——IOC和AOP原理彻底搞懂

一、AOP 1 Spring AOP 的实现原理 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 1 AspectJ是静态代理的增强&#xff1a;所谓静态代理就是AOP框架会在便一阶段生成AOP代理类&#xff0c;也叫编译器增强。 2 使用Spring AOP 与AspectJ 的静态代理不同&#xff0c…

厉害了,关于String的10道经典面试题

转载自 厉害了&#xff0c;关于String的10道经典面试题 1、String是基本数据类型吗&#xff1f; 2、String是可变的话&#xff1f; 3、怎么比较两个字符串的值一样&#xff0c;怎么比较两个字符串是否同一对象&#xff1f; 4、switch中可以使用String吗&#xff1f; 5、String …

ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)

【0】README 0&#xff09;本文旨在给出 快速排序 的 源码实现和源码分析&#xff08;分析它的坑&#xff09;&#xff1b; 2&#xff09;要知道 在 元素个数小于10的时候&#xff0c;快速排序不如插入排序&#xff1b;注意快速排序选取枢纽元 时 所使用的方法是 三数中值分割…

Spring boot web(2):web综合开发

1 web开发 Spring boot web 开发非常简单&#xff0c;其中包括常用的 json输出、filters、property、log等 1.1 json接口开发 在以前的Spring 开发我么提供json 的做法&#xff1a; 添加jackjson 等相关jar包配置Spring controller扫描对接的方法添加ResponseBody 而在Spri…

10道腾讯的Java面试题

转载自 10道腾讯的Java面试题 下面总结10道面试腾讯的Java面试题。 1、说几种常见的攻击方式及预防手段。 2、http1.x和http2.x的区别。 3、mysql查询语句怎么做性能分析。 4、你知道哪几种排序算法&#xff1f; 5、HashMap和HashTable的区别&#xff0c;并说明其底层实现数据…

ReviewForJob——桶式排序+基数排序(==多次桶式排序)

【0】README 1&#xff09;本文旨在 给出 ReviewForJob——桶式排序基数排序&#xff08;多次桶式排序&#xff09; 的 代码实现和代码分析&#xff1b; 2&#xff09;桶式排序基础参见 http://blog.csdn.net/pacosonswjtu/article/details/49685749&#xff0c; 基数排序基…

Spring boot(3):Spring boot中Redis 的使用

Spring boot除了常用的数据库支持外&#xff0c;对nosql数据库也进行了封装自动化。 1 Redis介绍 Redis 是目前业界使用最广泛的内存数据存储。相比memcached&#xff0c; &#xff08;1&#xff09;Redis支持更丰富的数据结构&#xff0c;例如hashes&#xff0c;lists&#x…

Java List面试题汇总

转载自 Java List面试题汇总 1、你知道的List都有哪些&#xff1f; 2、List和Vector有什么区别&#xff1f; 3、List是有序的吗&#xff1f; 4、ArrayList和LinkedList的区别&#xff1f;分别用在什么场景&#xff1f; 5、ArrayList和LinkedList的底层数据结构是什么&#…

ReviewForJob——拓扑排序+最短路径算法(有权+无权)

【0】README 1&#xff09;本文旨在给出 拓扑排序最短路径算法&#xff08;有权无权&#xff09; 的源码实现 和 分析&#xff0c;内容涉及到 邻接表&#xff0c; 拓扑排序&#xff0c; 循环队列&#xff0c;无权最短路径&#xff08;广度优先搜索&#xff09;&#xff0c;有权…

Spring boot (5):Spring data jpa 的使用

总结&#xff1a; jpa是什么&#xff0c;spring data jpa是什么&#xff1f; jpa是一套规范&#xff0c;不是一套产品。jpa是一套规范&#xff0c;不是一套产品。 spring data jpa是spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架&#xff0c;提供了包括增删改等在…

Java Map集合面试题汇总

转载自 Java Map集合面试题汇总1、 你都知道哪些常用的Map集合?2、Collection集合接口和Map接口有什么关系&#xff1f;3、HashMap是线程安全的吗&#xff1f;线程安全的Map都有哪些&#xff1f;性能最好的是哪个&#xff1f;4、使用HashMap有什么性能问题吗&#xff1f;5、Ha…

ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)

【0】README 1&#xff09;本文旨在给出 二叉堆优先队列的实现 的代码实现和分析&#xff0c; 而堆节点类型 不外乎三种&#xff1a; 一&#xff0c; 基本类型如int&#xff1b; 二&#xff0c;结构体类型 struct HeapNode&#xff1b; 三&#xff0c;结构体指针类型 struct H…