算法

给初学者一封信

六眼飞鱼酱① 提交于 2020-11-27 04:44:59
我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。 几个误区   初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种: 认为计算机技术等于编程技术: 有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。 其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面

汉诺塔递归算法

折月煮酒 提交于 2020-11-24 05:29:12
import java.util.Scanner; /** * 汉诺塔 * * @author JayChang * */ public class HanoiResolve { /** * 移动位置 * * @param positionA * @param positionB */ public static void move(String positionA, String positionB) { System.out.println(positionA + " --> " + positionB); } /** * 汉诺塔递归算法 * * @param num * @param positionA * @param positionB * @param positionC */ public static void hanoi(int num, String positionA, String positionB, String positionC) { if (num == 1) { move(positionA, positionC); } else { hanoi(num - 1, positionA, positionC, positionB); move(positionA, positionC); hanoi(num - 1, positionB,

最大和连续子串

风流意气都作罢 提交于 2020-11-21 05:44:16
一、问题描述 输入一组整数,求出这个整数数组最大和的连续 子串。例如,整数数组为{4, -2, 59, -45, 4},最大和的连续子串为{4, -2, 59},最大和为61。需要注意的是要求子串连续,另外,子串的长度可以是1. 这个也是曾经出过的一道面试提,最早是浙大的一道考研算法设计题。 二、问题分析 第一种方法。最简单的思路就是用两层循环来解决问题。外面一层是从1到整数数组的长度,里面的那层循环是当前的位置加1一直到整数数组的结束,里面的循环来算所有的和。 换句话说就是,内层循环每次从i+1开始到字符数组结束的和,这些和是numbers[i]+ numbers [i+1], numbers [i]+ numbers [i+1]+ numbers [i+2],..., numbers [i]+...+ numbers [length( numbers )]中找到最大的那个。外层循环则是找到全局最大的那个。这个方法比较好想,只给出伪代码, 这个的时间复杂度为: 下面是伪代码: for i = 0 to length(numbers) current = numbers[i] for j = i + 1 to length(numbers) current += numbers[j] if(current_max < current) current_max = current

最大乘积连续子串

陌路散爱 提交于 2020-11-20 08:37:56
一、问题描述 输入一组浮点数,求出这个浮点数组最大乘积的连续子串。举个例子,浮点数组为str[]={-3,-5,0,-1,-2,-2},这时得出来的结果是前两个浮点数的乘积,即15。需要注意的是,这个子串是要求连续的,另外,子串的长度可以为1. 二、问题分析 这里给出两种思路,后续可能还会加入新的思路。 第一种是直接求解。即用双层循环。外面一层是从1到浮点数组的长度,里面的那层循环是当前的位置加1一直到浮点数组的结束,里面的循环来算所有的乘积。换句话说就是,内层循环每次从i+1开始到浮点数组结束的乘积,这些乘积是str[i]*str[i+1],str[i]*str[i+1]*str[i+2],...,str[i]*...*str[length(str)]中找到最大的那个。外层循环则是找到全局最大的那个。这个方法比较好想,只给出伪代码。下面是伪代码: for i = 0 to length(str) current = str[i] for j = i + 1 to length(str) current *= str[j] if(current_max < current) current_max = current end if(max < current_max) max = current_max end 第二种思路就是如果当前已经找到一个序列的最大的值为current

用C写有面向对象特点的程序

廉价感情. 提交于 2020-11-20 07:06:05
转载自:陈皓 http://blog.csdn.net/haoel/archive/2003/04/02/2864.aspx 比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如: class Links { public: Links* back; Links* forword; virtual Add(){ ... }; virtual Del(){ ... }; virtual Ins(){ ... }; virtual Print() =0; .... }; 于是对于特定的数据结构我们可以: class mylinks : public Links { public: char* myname; char sex; int age; ... virtual Print(){ .... } }; 对其操作时都可以使用你类的泛型算法。 在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。 下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:(我在Liniux下的GCC调试通过) ======================================= #include

POJ1611 The Suspects (并查集)

坚强是说给别人听的谎言 提交于 2020-10-29 18:50:07
本文出自: http://blog.csdn.net/svitter 题意:0号学生染病,有n个学生,m个小组。和0号学生同组的学生染病,病可以传染。 输入格式:n,m 数量 学生编号1,2,3,4 //m个分组 题解:最为典型的并查集。 解法一:求出所有的集合,然后求出0的parent,把parent为0的parent所有学生求出。 解法二:在计算的过程中统计total; 解法一:(一开始用的Vim写的在POJ上交出现 访问禁止错误- - 不知道又神奇的碰上了什么BUG,删了main函数中几个换行符就好了) #include <iostream> #include <stdio.h> using namespace std; int stu[30001]; //the num of stu, group int n, m; void init() { for(int i = 0; i < n; i++) stu[i] = i; } int getParent(int a) { if(a == stu[a]) return a; else return stu[a] = getParent(stu[a]); } void Merge(int a, int b) { if(getParent(a) == getParent(b)) return; else stu[getParent

tarjan算法

旧街凉风 提交于 2020-10-28 08:10:57
简介 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。 直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。 (注:双向遍历方法可以参考算法导论图论中深度优先遍历部分,主要是利用了拓扑排序和转置图) 算法伪代码 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。 定义DFN(u)为节点u搜索的次序编号(时间戳),Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。由定义可以得出 Low(u)=Min { DFN(u), Low(v),(u,v)为树枝边,u为v的父节点 DFN(v),(u,v)为指向栈中节点的后向边(非横叉边) } 当DFN(u)=Low(u)时

第三次CCF计算机软件能力认证题目:Z字形扫描

三世轮回 提交于 2020-05-08 06:35:48
这是第三次CCF计算机软件能力认证考试(2014年12月14日)的一道题目。小编今天有幸免费参加了这次考试。据说这题是谷歌的笔试题变形??求证实。。 好了,题外话不啰嗦,看题目 题目 题目详细如下:(来源自 http://bbs.csdn.net/topics/390953265 ,好惊奇的帖子,不知道是哪位同学在考试期间居然能发帖到CSDN,让我有幸复制到考试原文。此外 http://www.0531s.com/content-53-1928772-1.html 有转发) 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:   对于下面的4×4的矩阵,   1 5 3 9   3 7 5 6   9 4 6 4   7 3 1 3   对其进行Z字形扫描后得到长度为16的序列:   1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3   请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。 输入格式   输入的第一行包含一个整数n,表示矩阵的大小。   输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。 输出格式   输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。 样例输入 4 1 5 3 9 3

常见数据结构(二)-树(二叉树,红黑树,B树)

醉酒当歌 提交于 2020-05-04 05:56:55
常见数据结构(二)-树(二叉树,红黑树,B树) 标签: algorithms [TOC] 本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程 《Algorithms, Part I》 中的Slides 相关命题的证明可参考 《算法(第4版)》 源码可在 官网 下载,也可以在我的github仓库 algorithms-learning 下载,已经使用maven构建 仓库下载: git clone git@github.com:brianway/algorithms-learning.git Binary Search Tree(二分查找树) 定义:A BST is a binary tree in symmetric order . A binary tree is either: Empty. Two disjoint binary trees (left and right). Symmetric order.Each node has a key, and every node’s key is: Larger than all keys in its left subtree. Smaller than all keys in its right subtree. 在java的实现中,每个节点

【leetcode编程题目354】俄罗斯套娃

丶灬走出姿态 提交于 2020-05-04 04:34:05
来自 https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and heights given as a pair of integers (w, h) . One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope. What is the maximum number of envelopes can you Russian doll? (put one inside other) Example: Given envelopes = [[5,4],[6,4],[6,7],[2,3]] , the maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]). 这个题目是最长子序列的变形;最长子序列可以参考https://en.wikipedia.org/wiki/Longest_increasing