算法
文章平均质量分 64
Fridges
这个作者很懒,什么都没留下…
展开
-
求最大子段和的几种方法以及性能测试
我是计院出身的,但是感觉自己算法方面比较薄弱,这些天抽些时间把以前的问题拿出来总结一下。最大子段和问题是一个比较基础的问题,在《数据结构与算法:c语言实现》比较靠前的位置。为了便于说明,假设存在一个数组a,长度length.a和b做下标且a小于b。算法一 时间复杂度:O(n^3) 算法思想:对于每一个可能的区间[a,b]都去求其和,找到其中的最大值。int max_sub_sum_1(cons原创 2015-07-29 21:57:45 · 851 阅读 · 0 评论 -
排序算法就是那么回事儿<二>
上一次我们讲解了快速排序归并排序。其实这两个算法有一个共同点,就是都运用到了分治的思想。而且我们还了解到这两个算法的时间复杂度分别为O(nlogn)和O(nlogn)(最差为O(n^2))其实,快速排序法的精髓就在于交换,他其实是另一种算法的该进。这个算法就是冒泡排序。冒泡排序法 冒泡排序算法的运作如下:(从后往前) 1 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2 对原创 2015-09-12 20:42:36 · 317 阅读 · 0 评论 -
优先队列那些事儿
如果要用最简单的话说明:什么是优先队列? 博主在《数据结构与算法分析》上找到了这样一句话: 优先队列是至少允许下列两种操作的数据结构:Insert,DeleteMin实现方式? 我们在我们先前看过的数据结构中选择一样: 先看看他们的复杂度 数据结构 Insert DeleteMin 无序链表 O(1) O(n)(遍历n寻找最小元素) 有序链表 O(n)原创 2015-09-13 01:01:46 · 369 阅读 · 0 评论 -
动态规划之《寻找最大上升序列》
今天做爱奇艺的在线笔试时看到这道题目,这个问题本身见过的,但是当时因为一点小疏忽,导致没有做出来。非常可惜。问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1< s2< s3< …< sn并且这个子序列的长度最长。找出这个最长序列。(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题原创 2015-09-27 11:21:51 · 465 阅读 · 0 评论 -
排序算法就是那么回事儿<一>
想来已经大四了,如果真的有什么对大一的自己能说的话,那么就是,其实编程没有什么窍门,无非就是多想,多练。玩玩别被看似复杂的算法给迷住了双眼,其实其核心思想总是只有那么几点。只要多加练习,就能领略其中之美。 另有一点是,有了合适的入门读物,就可以少很多曲折和反复。请注意:合适。这个难度不应该太高,陡峭地让你爬不上去,也不能仅仅是罗列代码。只要能够用自己的语言将这个算法概括出来,那就说明你已经原创 2015-09-12 17:33:28 · 323 阅读 · 0 评论 -
排序算法就是那么回事儿<三>
堆排序:堆每一次DeleteMin的时间复杂度是O(logn),这看起很不错,因为n次出堆也只需要O(nlogn)次。那我们是否可以每次出最小树,这样将数组排序呢? 当然可以!我们这就来实现一下!如果忘记DeleteMin的实现,我们不妨再重新复习一下。队列那些事儿int DeleteMin(priority_queue pq){ if(pq.empty()) error();原创 2015-09-16 23:18:05 · 315 阅读 · 0 评论 -
串的模式匹配算法——KMP算法解析
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。要想知道KMP的高效性在哪里,我们就首先需要了解常规算法原创 2015-09-18 12:27:06 · 530 阅读 · 0 评论 -
图的那些事儿——Dijkstra和Floyd
最短路问题Dijkstra算法 说到最短路问题,我相信只要是学习过计算机的人都有听说过Dijkstra他老人家,他对程序的贡献远不止一个算法。 1 提出“goto有害论”; 2 提出信号量和PV原语; 3 解决了“哲学家聚餐”问题; 4 最短路径算法(SPF)和银行家算法的创造者; 5 第一个Algol 60编译器的设计者和实现者; 6 THE操作系统的设计者和开原创 2015-09-18 12:50:26 · 414 阅读 · 0 评论 -
树的那些事儿
连通、不含圈、恰好有n-1条边和n个顶点——这就是树 而这3个条件中的任意两点都可以对出另一点 本文将深入浅出介绍各种树的相关无根树转有根树其实所谓无根树,指代的就是无圈连通图。我们知道树其实就是图的特例,只要这个图满足无圈连通,那么其实本质上就是树,只是没有一个根罢了。我们姑且来看看一个最简单的例子。 A/ \B C / \ D E毫无疑问,这是一个典型原创 2015-09-10 20:10:26 · 71 阅读 · 0 评论 -
把《Effective C++》读薄
这本书很早就打算看了,但是一直没有开始。我觉得这本书其实只需要有一定C++经验,越早接触越好!1view c++ as a federation of languages 应该看作C、STL、Templete、面对对象四个部分prefer consts,enum,inline to #defineuse const whenever possiblemake sure the objec原创 2015-09-19 20:25:00 · 314 阅读 · 0 评论 -
拓扑排序的DFS和BFS
博主以前有一个疑问,DFS和BFS各自的适用范围是?我想你今天看了这篇文章之后会有一个判断!BFS 数据结构与算法分析:c语言描述(p217) 已经存在一个Indgree入度数组(indgree[v]={(u,v)的数目}) 以及一个邻接矩阵,求一个拓扑排序 提示:图中出现环就会拓扑失败 代码风格被我改为了C++void TopSort(vecto原创 2015-09-12 15:02:08 · 901 阅读 · 0 评论 -
递归那些事儿
这个里面用来写一些我遇到的递归题目Subsets Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain du原创 2015-09-04 00:27:54 · 346 阅读 · 0 评论 -
去除字符串中的重复字符——方法汇总和性能测试
Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not.原创 2015-07-31 01:30:26 · 1152 阅读 · 0 评论 -
判别同位词算法
原问题在这里 Write a method to decide if two strings are anagrams or not.同位词(anagrams)是指两个单词的字符相同,但是字符的位置不同。算法一 算法思想:将两个单词的词汇进行排序,然后再进行比较。本质上就是让各个字符都可以在其应有的位置上。#include<algorithm>#include<cstring>int c原创 2015-07-31 15:57:50 · 890 阅读 · 0 评论 -
旋转矩阵的算法
旋转矩阵是计算机图形学里面的基础内容。之前我还写过一篇计算机图形学基础知识的总结 操作的步骤可以分为两部,一是沿正对角线对称,二是沿水平对称轴对称原图: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ==》第一步之后:1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 ==》第二步之后:4 8 12 16 3原创 2015-07-31 17:47:55 · 3165 阅读 · 0 评论 -
链表的几个相关操作
这篇文章用来总结有通用性的代码参考,以后会不定时更新链表的定义typedef struct myNode inode;struct myNode{ inode* next; int data;};生成链表 注意一点:为了操作方便,设置了一个空的头结点/************************************生成一个链表,并且返回头结点(数组的大小不原创 2015-08-02 14:43:19 · 387 阅读 · 0 评论 -
堆栈的一些小小的实践
/*只用一个数组实现三个栈*//*方法1,每个栈都有一个栈顶,三部分平分数组*/#define SIZE 100template<class T> class istack{private: int size; T *buf; int stack_top[3];public: istack(int i = 300){ size = i;原创 2015-08-03 05:58:14 · 352 阅读 · 0 评论 -
裴波那数列的计算
今天看到了一篇文章关于如何求解裴波那数列的方法。觉得叙述得很好。斐波那契数列的定义如下: f(1) = f(2) = 1; f(n) = f(n-1) + f(n-2);转载 2015-08-17 15:17:11 · 688 阅读 · 0 评论 -
给定一个有序数组(递增),构建一棵具有最小高度的二叉树
给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。想要使构建出来的二叉树高度最小,那么对于任意结点, 它的左子树和右子树的结点数量应该相当。比如,当我们将一个数放在根结点, 那么理想情况是,我们把数组中剩下的数对半分,一半放在根结点的左子树, 另一半放在根结点的右子树。我们可以定义不同的规则来决定这些数怎样对半分, 不过最简单的方法就是取得有序数组中中间那个数,然后把小于它的放在它的左转载 2015-08-05 16:55:52 · 839 阅读 · 0 评论 -
格子路径问题
在一个N*N矩阵的左上角坐着一个机器人,它只能向右运动或向下运动。那么, 机器人运动到右下角一共有多少种可能的路径? 进一步地, 如果对于其中的一些格子,机器人是不能踏上去的。设计一种算法来获得所有可能的路径。不妨将这个问题再泛化一下,想象这个矩阵是m*n的,左上角的格子是(1, 1), 右下角的坐标是(m, n)。那么其递归就应该是: path(i, j) = path(原创 2015-09-02 18:46:30 · 1345 阅读 · 0 评论 -
动态规划的那些事儿
动态规划是一个重要的算法,这几天我搜集了一些相关的题目,这些题目在leetcode上都可以找到House Robber You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint原创 2015-09-02 20:28:22 · 414 阅读 · 0 评论 -
链表的那些事儿<一>
现在想起来大一上黄老师的课,很多人学习到链表这一块时,就有些吃力。 我的看法是,如果有一天你遇到了无法理解的东西,那么就尝试接受他,直到有一天,你会发现这个东西是如此自然,以至于不理解都不可能。让我们先做几个关于链表的小操作锻炼一下~翻转链表难度:easy 要求:空间复杂度为O(1) 我们不可能新开一个链表,所以必须在原链表上进行更改。假定有链表 例如:A->B->C->D实现list原创 2015-09-24 14:12:58 · 79 阅读 · 0 评论