
算法
文章平均质量分 77
cdai
这个作者很懒,什么都没留下…
展开
-
为什么要学习排序算法?
为什么要学习排序算法?根据统计,早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法,各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见,我们为什么还要自己动手实现呢?虽然经典算法要动手写写加深印象的道理都懂,但直到最近才发现,每种排序算法里都“暗藏玄机”。排序算法看似简单,其实不同的算法中蕴涵着经典的算法策略。通过熟练掌握排序算法,就可以掌握基本的算法设计思想,包括暴力枚举法、时间空间置换、子问题的分治以及随机化。1.选择排序:暴力搜索1.1 “暴力”的定义按原创 2021-04-30 08:21:54 · 2332 阅读 · 0 评论 -
程序员修炼之路-(2)线性表(下):栈、队列
2 基础数据结构数组和链表是实现各种数据结构的基石,本节中的三种最基本的数据结构都可以用数组或者链表来实现。2.1 栈用数组实现“栈”非常简单。下面以C++为例,实现一个简单的固定大小的“栈”。首先,接口API定义如下,核心函数就是push()和pop():2.1.1 数组实现下面用数组方式的实现“栈”,当然也可以用链表实现数组,但是一般尽管栈会处理很多操作,但任意时刻保存在栈中的元素不会很多,所原创 2015-03-31 21:24:41 · 2327 阅读 · 0 评论 -
程序员修炼之路-(1)基础(中):性能分析
3 算法分析“分析”二字的含义很广泛,在算法分析的领域,指的就是算法的效率,包括运行时间效率(时间复杂度)和内存空间使用效率(空间复杂度)两方面。同时,研究表明,通常时间方面比空间能取得更大的进展,因此我们进一步将分析的重点放在时间复杂度上。3.1 算法分析 - 科学实验方法科学家用来理解自然世界的方法对分析程序的运行时间来说同样有效:1) 观察:观察自然世界的一些特性,并用准确的度量表示原创 2015-03-31 20:39:32 · 3274 阅读 · 0 评论 -
程序员修炼之路-(2)线性表(上):数组与链表
1 两块基石数组与链表构成各种数据结构的基石,是实现所有数据结构必不可少的元素。1.1 数组数组一般内置于编程语言中,直接通过索引(index)读写。索引一般为数字,有的语言甚至直接支持如字符串等其他类型的索引。在很多数据结构中都能看到数组的身影,例如字符串、动态数组、堆、栈和队列(用链表也可以,但用数组实现很高效)等。1.2 链表概念上都能理解,但实现起来还真有很多容易出错的地方。实现细节Ø原创 2015-03-31 21:18:22 · 2519 阅读 · 2 评论 -
程序员修炼之路-(3)排序(上):基本排序
1 基本排序对于所有排序算法,被排序元素需要满足下列数学性质:Ø 自反性(reflextive):for all v,v=vØ 对称性(antisymmetric):for all v and w,if vv and if v=w then w=vØ 传递性(transitive):for all v,w and x,if v对于包含这样元素的数组,我们才能对其排序。1.1 选择排序(sel原创 2015-03-31 21:09:49 · 2559 阅读 · 0 评论 -
Leetcode解题-链表(2.2.6)RotateList
1 题目:Rotate ListGiven a list, rotate the list to the right by k places, where k is non-negative.For example:Given 1->2->3->4->5->nullptr and k = 2, return 4->5->1->2->3->nullptr.2 实现首先确定题目要求的旋转都需要哪些结点原创 2015-03-28 11:27:33 · 1936 阅读 · 0 评论 -
Leetcode解题-树(5.0.0)基础类
与第二章类似,LeetCode指定了TreeNode实现。为了方便后续习题的编写和测试,创建一个基础父类,包含TreeNode实现,以及create()和print()创建和打印树的方法。其中create()采用类似“堆”的方式,用数组表示树形结构,复习一下,左右子结点就是2*i和2*i+1。而print()方法采用前序遍历的方式,通过额外一个参数level确定当前结点的深度,从而打印一些制表符或原创 2015-03-28 11:25:09 · 2090 阅读 · 0 评论 -
Leetcode解题-链表(2.2.2)ReverseLinkedList
题目:2.2.2 Reverse Linked List IIReverse a linked list from position m to n. Do it in-place and in one-pass.For example:Given 1->2->3->4->5->nullptr, m = 2 and n = 4,return 1->4->3->2->5->nullptr.Note:原创 2015-03-28 11:17:21 · 2600 阅读 · 0 评论 -
Leetcode解题-链表(2.2.3)PartitionList
题目:2.2.3 Partition ListGiven a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of原创 2015-03-28 11:21:07 · 2071 阅读 · 0 评论 -
用Codility测试你的编码能力
没有宏观的架构设计,没有特定的框架语言。在Codility提出的一些小问题上,用最纯粹的方式测试你最基本的编码能力。Codility第一课:算法复杂度各种算法书的开篇大多是算法分析,而复杂度(complexity)又是最基本的分析指标。所以Codility的第一课也不例外,直入复杂度主题。这里不再详述其概念,而只提及复杂度的几个注意点:复杂度不是程序运行时间的准确度量,而是数量级。重点是找到主要因原创 2015-01-19 21:53:11 · 19254 阅读 · 0 评论 -
关系代数的并行计算
从Dremel和Impala的学习引申出了SQL查询的并行执行问题,于是借此机会深入学习一下关系数据库以及关系代数的并行计算。Speedup和ScaleupSpeedup指用两倍的硬件换来一半的执行时间。Scaleup指两倍的硬件换来同等时间内执行两倍的任务。但往往事情不是那么简单,两倍的硬件也会带来其他问题:更多CPU带来的长启动时间和通信开销,以及并行计算带来的数据倾斜问题。多处理器架构共享内原创 2014-12-13 14:07:56 · 2926 阅读 · 0 评论 -
Mahout学习路线图
转自:http://blog.fens.me/hadoop-mahout-roadmap/Mahout学习路线图Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalo转载 2014-01-13 16:20:23 · 3036 阅读 · 5 评论 -
程序员修炼之路
前言:《程序员修炼之路-(0)前言:在路上, 再上路》在前言中已经对知识体系进行了梳理,主要分为问题定义、算法与数据结构、系统平台API、编程语言实现、代码设计、测试验证等等。目前集中精力编写算法与数据结构部分,这可能也是最艰难的一部分,之后再考虑补充其他部分。对于这一部分的内容编排,主要以《算法设计与分析基础》、《算法》以及LeetCode算法题中的问题分类为横向,以《算法设计与分析基础》中罗列原创 2015-03-31 20:48:26 · 4434 阅读 · 0 评论 -
程序员修炼之路-(1)基础(下):正确性证明
来自《Writing Solid Code》的一则小故事,Donald Knuth在其著名的排版软件TEX的封面上写到:“I believe that the final bug in TEX was discovered and removed on November 27, 1985. But if, somehow, an error still lurks in the code, I s原创 2015-03-31 20:44:19 · 13697 阅读 · 7 评论 -
程序员修炼之路-(4)搜索(中):二叉查找树
2 查找:鱼与熊掌前面已经介绍了线程查找和二分查找的符号表(symbol table)实现,但现代应用的特点是查找与插入或删除操作交叉在一起,无法预测,并且表非常巨大。因此问题的关键就是我们能否设计出具有对数性能的search和insert/delete操作的数据结构和算法?为了实现高效的插入,我们需要链表结构。但是单链表却又阻止了二分查找的使用,因为二分查找依赖数组的快速访问才能快速定位到每次迭原创 2015-04-12 09:45:39 · 3359 阅读 · 0 评论 -
关于算法学习的总结和感悟
时隔一年重读《算法导论》,去年读到了二叉查找树就搁浅了,今年从头捡起,希望能走的更远一些。算上大学时的数据结构与算法课,今年可以算是第三波学习攻势了。随着学习的深入,对算法的学习渐渐有了些自己的看法和感悟。一.为什么学习算法?记得初学算法时不明白为什么费力分析程序的执行步骤后,还要用公式表达出来并求极值。一遍遍的学习渐渐有了领悟:算法研究是用来做大事的!之所以...原创 2012-03-31 20:27:37 · 815 阅读 · 0 评论 -
Leetcode分类解析:二分查找
Leetcode分类解析:二分查找1.原始二分查找1.1 典型例题35-Search Insert Position (Medium): Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it w原创 2016-08-14 09:04:25 · 5312 阅读 · 4 评论 -
Leetcode分类解析:链表
Leetcode分类解析:链表1.分类地图按照惯例,首先来看一下链表在本系列所处的位置:基础结构(Fundamentals) 1.1 数组和链表(Array&List):插入、删除、旋转等操作。 1.2 栈和队列(Stack&Queue):栈的典型应用。 1.3 树(Tree):构建、验证、遍历、转换。 1.4 字符串(String):转换、搜索、运算。积木块(Building Bloc原创 2016-08-13 08:28:14 · 4208 阅读 · 2 评论 -
关于算法,那些你不知道的事
关于算法,那些你不知道的事1.算法,不止于刷题提到算法,不管是科班出身还是半路出家的程序员可能都会说上几句,算法谁没学过谁不知道啊?对于走工业界路线而非学术路线的同学来说,算法学习的最大作用也许是找工作…… 毕竟工作后,绝大多数时候都用各种成熟的类库,少有自己实现高级数据结构和算法的时候。但刚结束一学期修的算法课,上得我还真跟没学过算法似的,让我大开眼界,虽然每次课上我都听的不是很懂,但每节都期盼着原创 2016-06-20 23:41:44 · 11755 阅读 · 6 评论 -
Leetcode分类解析:组合算法
Leetcode分类解析:组合算法所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合、排列、子集、分区等等,然后逐一确认每种是不是我们要的解。从广义上来说,组合算法可以包罗万象,甚至排序、各种搜索算法都可以算进去。最近读《The Algorithm Design Manual》时了解到这种归类,上网一查,甚至有专门的书籍讲解,而且Knuth的巨著TAOCP的第四卷就叫组合算法,看来原创 2016-07-04 23:47:17 · 8171 阅读 · 4 评论 -
Leetcode算法题分类解析:(一)总览
Leetcode算法题分类解析:(一)总览1.为何/如何刷题1.1 必要性刷题刷题,从“刷”字就能看出其中的机械性和应试性,但这就是几乎所有IT公司面试中的一环。尽管面试者可能也对这种考察方式不是很满意,可在没有更好的方式之前,这个现状会一直保持下去。我们改变不了这个现状,那就适应它吧。1.2 分类攻破为什么要这么麻烦地分类呢?照着Leetcode的题目顺序做不就好了?个人觉得分类有几个动机:一是原创 2016-06-17 23:01:03 · 12650 阅读 · 3 评论 -
算法学习的新阶段
算法学习的新阶段最近忙得一塌糊涂,所以根本没时间总结整理学习成果了。之前刚开学不太忙时写了几篇都没写完,因为发现面前开启了一道道大门,想系统整理的东西太多了。于是时隔快两个月,先发一篇以作记录,系统整理只能等到暑假开始时了……1.基本数据结构一开始接触到算法是在大学,具体有什么用也不清楚。但老师一般都说:算法+数据结构=程序。当时听起来觉得太重要了(确实重要,但现在知道了,程序的世界何止算法和数据结原创 2016-04-10 06:48:55 · 4977 阅读 · 2 评论 -
六星经典CSAPP-笔记(10)系统IO
六星经典CSAPP-笔记(10)系统I/O1.Unix I/O所有语言的运行时系统都提供了高抽象层次的I/O操作函数。例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓冲功能的函数;C++中则重载了<<和>>用来支持读写。在Unix系统中,这些高层次的函数基于Unix的系统I/O函数来实现,多数时候我们都无需直接使用底层的Unix I/O。但学习Unix系统I/O能更好地原创 2015-05-16 22:40:06 · 2995 阅读 · 0 评论 -
Antlr v4入门教程和实例
1 重逢ANTLR最早知道ANTLR是当年学习Apache Derby数据库源码时,在看到SQL解析那一层时,第一次看到编译原理在实际项目中的应用,惊叹之余也只能望而却步。之前也根据网上一些资料尝试了一下,看介绍说ANTLR v4更加易用了,于是又好奇地试用一下。以下入门介绍主要参考ANTLR作者写的《The Definitive ANTLR 4 Reference》。1.1 ANTLR全景当我们原创 2015-04-30 21:30:05 · 58975 阅读 · 6 评论 -
Leetcode难度表及解题汇总
Leetcode难度表及解题汇总参考网上一份题目难度表,以及本人的解题。 Id Question Difficulty Frequency Data Structures Algorithms Blog Comment 1 Two Sum 2 5 array+set sort+2ptr 2 Add Two Numbers原创 2015-05-08 22:08:21 · 4391 阅读 · 0 评论 -
协同过滤推荐及相似性度量
协同过滤 —— Collaborative Filtering协同过滤简单来说就是根据目标用户的行为特征,为他发现一个兴趣相投、拥有共同经验的群体,然后根据群体的喜好来为目标用户过滤可能感兴趣的内容。协同过滤推荐 —— Collaborative Filtering Recommend协同过滤推荐是基于一组喜好相同的用户进行推荐。它是基于这样的一种假设:为一用户找到他真正感转载 2014-01-08 10:42:21 · 25141 阅读 · 2 评论 -
Trie的应用及拼写检查器的优化
之前实现的拼写检查器,是用Hash表来保存语言模型(Language Model)。每个单词插入到Hash表时都要先计算一个Hashcode值来作为Id。因此插入一个单词到Hash表(不冲突的情况下)与查询一个单词的效率都是O(len),其中len是单词的长度。我们也可以用一种叫Trie的树形结构来保存语言模型。Trie的结构非常简单,举个简单的例子,对于下面这些单词:an, an原创 2011-12-29 22:11:20 · 3433 阅读 · 0 评论 -
贝叶斯公式与拼写检查器
年底工作不是很忙,今天复习了下概率论中贝叶斯的基础知识,动手写了个Java版本的简单的拼写检查器。我们在使用Google时,当我们输入一个错误的单词,经常可以看到Google提示我们是不是要查找什么什么。它是怎样做到的呢?现在我们就来实现一个简单的拼写检查器。1. 什么是贝叶斯公式?来看来自维基百科的定义:贝叶斯定理贝叶斯原创 2011-12-27 22:34:22 · 5095 阅读 · 0 评论 -
《算法导论》第6章 堆排序 (2)优先级队列
6.5 优先级队列在实际中堆的一个很常见的应用:用来实现高效的优先级队列。优先级队列分为最大优先级队列和最小优先级队列。最大优先级队列的一个应用是在一台分时计算机上进行作业调度。需要在堆中的每个元素里存储对应对象的柄(handle)。#include #define PARENT(i) ((i) / 2)int heap_maximum(in原创 2012-02-17 22:25:59 · 2237 阅读 · 0 评论 -
《算法导论》第9章 顺序统计学 (2)随机选择
randomized_select使用划分方法randomized_partition(),返回主元位置q(第k小元素)。要查找的是第 i 小元素,若恰好等于k,那么直接返回。如果 i 如果 i > k,则继续在[q + 1, r]中搜索第 i - k 小元素。int randomized_select(int A[], int p, int r, int i){原创 2012-02-25 23:00:23 · 2077 阅读 · 0 评论 -
《算法导论》第7章 快速排序 (四种变形)
这一章的正文及思考题部分讲到了快速排序及其几种变形,包括:Hoare快排,普通快排,随机快排,三数取中快排。这些快排的区别主要是划分方法PARTITION算法的不同:如何选取主元,划分出的两部分范围是什么。根据划分出的范围不同,各变形的QUICKSORT有微小的差别。1. Hoare快排Hoare划分是最初的版本,与《算法导论》中的划分版本相比,原创 2012-02-24 23:19:26 · 4403 阅读 · 0 评论 -
《算法导论》第6章 堆排序 (3)K路归并
问题描述:问题来自习题6.5-8 给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)。在K路归并问题中,取出最小堆的根元素(最小元素)后,如果此元素没有后继元素(next为空),则有两种方案:一、从K路中的另一个链表取出一个元素放到根位置。二、将堆底部最后一个元素挪原创 2012-02-15 21:58:41 · 6919 阅读 · 4 评论 -
《算法导论》第6章 堆排序 (1)最大堆与堆排序
6.1 堆“堆”这个词最初是在堆排序中提出的,但后来就逐渐指“废料收集存储区”,像Lisp和Java中提供的那样。(二叉)堆是一种数组对象,可以被视为一棵完全二叉树。length[A]是数组中的元素个数,heap-size[A]是存放在A中堆的元素个数。树的根是A[1]。堆的重要函数:max_heapifybuild_max_heapheap原创 2012-02-14 22:40:03 · 2283 阅读 · 0 评论 -
《算法导论》第6章 堆排序 (4)Young氏矩阵
1. 什么是Young氏矩阵?一个 m * n 的矩阵,其中每一行的数据都从左到右排序,每一列的数据都从上到下排序。其中用 ∞ 代表不存在的元素,一共可以存放 r ≤ mn 个有限的数。如下面程序实现中用来测试的Young氏矩阵:{ 1, 3, 5, 7, 8, 11 }{ 4, 6, 9, 14, 15, 19 }{原创 2012-02-22 22:08:03 · 3283 阅读 · 0 评论 -
丢番图与麦乐鸡购买问题
在MIT公开课《计算机科学与编程导论》的Assignment2中,提到了丢番图方程,并有趣地将丢番图方程和卖麦乐鸡的问题联系到了一起。首先让我们来看看维基百科中介绍的丢番图方程。一、丢番图方程 丢番图方程丢番图方程又名不定方程、整系数多项式方程,是变量仅容许是整数的多项式等式;即形式如右上角图的方程,其中所有的aj、bj和c均是整数原创 2011-12-31 17:40:45 · 5245 阅读 · 4 评论 -
MIT《计算机科学与编程导论》第七讲
Section 1mutableL1 = [1, 2, 3]L2 = L1L1[0] = 4print L2 -> [4, 2, 3] immutablea = 1b = aa = 2print b - 1Dictionaries 字典类型-mutable-not ordered-generalized indexin原创 2011-12-30 23:04:13 · 6378 阅读 · 2 评论 -
C#正则表达式整理备忘
对正则表达式不错的总结,同样适用于Java等其他语言。转载自:http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html有一段时间,正则表达式学习很火热很潮流,当时在优快云一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的《C#字符串和正则表达式参考手册》学习了一些基础的知识,同转载 2011-12-30 19:22:48 · 1698 阅读 · 0 评论 -
《算法导论》第二章 入门
2.1 Insertion sortPseudocode is used to specify a given algorithm in English. Issues of data abstraction,modularity, and error handling are often ignored in order to convey the essence o原创 2012-01-16 21:59:35 · 2641 阅读 · 0 评论 -
斐波那契数列算法分析
http://www.cnblogs.com/CCBB/archive/2009/04/25/1443441.html背景:假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?在一月底,最初的一对兔子转载 2012-01-10 22:50:27 · 2306 阅读 · 0 评论 -
《算法导论》第9章 顺序统计学 (1)最小值和最大值
1. 查找最小值逻辑比较简单,用第一个元素来初始化最小值min,然后与数组中其余元素比较,找出最小值。时间复杂度是O(n),已经最优化了。int minimum(int A[], int len){ int min = A[0]; int i; for (i = 2; i < len; i++) if (A[i]原创 2012-02-25 22:58:47 · 3310 阅读 · 0 评论