
算法与数据结构
文章平均质量分 64
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
hashmap C++实现分析
一、简介Map 是 Key-Value 对映射的抽象接口,该映射不包括重复的键,即一个键对应一个值。在HashMap中,其会根据hash算法来计算key-value的存储位置并进行快速存取。本文介绍的C++ hashmap,是一个缓存用的hash_map,实现模仿自Java的HashMap,做了一些改造和精简。特点:无读锁, 低写锁, 不删除只添加/更新, 桶不扩容, 按经验值初始...原创 2018-08-12 17:24:50 · 18955 阅读 · 0 评论 -
【每日算法】堆排序&优先队列
堆排序(heapsort)的运行时间为O(n logn),是一种原地排序算法,是不稳定的排序算法。堆基本介绍先直观感受一下,下面就是一个堆:16 7 3 20 17 8什么??上面不就一个数组吗……?!没错,(二叉)堆数据结构是一种数组对象。不过,让我们用另外一种方式来看这个数组:对于表示堆的数组arr[1…n],我们以arr[1]为根,给定某个节点下标i,令其父节点和左右后代节点的下标为:pare原创 2016-02-19 23:42:41 · 5050 阅读 · 4 评论 -
【每日算法】归并排序及其应用(逆序对&合并有序链表)
归并排序是建立在归并操作上的排序算法,是采用分治法(Divide and Conquer)的一个非常典型的应用,它常用来做外排序。若将两个有序表合并成一个有序表,称为二路归并。外排序外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,原创 2016-02-19 19:10:36 · 2840 阅读 · 0 评论 -
【每日算法】插入&选择&冒泡排序
在正式讲排序算法之前,我们先看一个概念:排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。插入排序这是一个对【少量元素】进行排序的有效算法。思想:想象你在打扑克牌,原创 2016-02-18 23:50:43 · 4420 阅读 · 3 评论 -
【每日算法】快速排序及其应用
快速排序快排的最坏运行时间为O(n^2),平均运行时间为O(n logn),且隐含的常数因子很小,能够进行就地排序。快排基于分治模式,其基本思想:分解:从序列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,从而得到两个子序列。解决:递归调用快速排序,对两个子序列进行排序。合并:因为子序列是就地排序的,所以合并不需要任何操作。伪代码:quickSort(arr,原创 2016-02-18 15:55:47 · 6837 阅读 · 1 评论 -
【每日算法】快速幂
数值的整数次方实现函数double Power(double base, int n) 求base的n次方,不得使用库函数,同时不需要考虑大数问题。Tips问题本身很直观,但是越简单的题越需要细心思考,包括边界问题和效率问题,如果不能考虑到以下3点,就无法给出令人满意的答案:考虑n为负数的情况;考虑base为0的情况;当n较大时,如何保证效率?分析针对上面3个问题,我们逐一解答:1.在计算原创 2016-02-18 11:50:53 · 6364 阅读 · 1 评论 -
【每日算法】洗牌算法
洗牌算法给定一个n个数的序列,设计一个算法将其随机打乱,保证每个数出现在任意一个位置的概率相同(也就是说在n!个的排列中,每一个排列出现的概率相同)。原创 2016-02-18 10:27:19 · 2794 阅读 · 0 评论 -
【每日算法】开篇&二分查找
开篇算法是神奇的。IT技术日新月异,各种语言、工具、平台快速更迭着。而算法、数据结构,几乎是不会过时的。之前学习了算法与数据结构,但是总感觉没有用武之地,对算法的认识大多仅限于”程序设计大赛”。因为不常用,所以渐渐生疏。前阵子在学习lighttpd的源码,发现里面的算法、数据结构几乎贯穿了整个项目,数组、字符串、链表、树等数据结构以及二分查找等算法的灵活应用,使得整个项目的逻辑原创 2016-02-18 10:24:36 · 2835 阅读 · 1 评论 -
【LeetCode】326. Power of Three (优雅的数学解法)
QuestionGiven an integer, write a function to determine if it is a power of three.Follow up: Could you do it without using any loop / recursion? SolutionThis can be generalized for any 【prime】 number原创 2016-01-11 10:47:33 · 1625 阅读 · 0 评论 -
TF-IDF与余弦相似性的应用(二):找出相似文章
上一次,我用TF-IDF算法自动提取关键词。今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供多条相似的新闻。为了找出相似的文章,需要用到"余弦相似性"(cosine similiarity)。下面,我举一个例子来说明,什么是"余弦相似性"。转载 2016-01-09 19:40:38 · 766 阅读 · 0 评论 -
TF-IDF与余弦相似性的应用(一):自动提取关键词
这个问题涉及到数据挖掘、文本处理、信息检索等很多计算机前沿领域,但是出乎意料的是,有一个非常简单的经典算法,可以给出令人相当满意的结果。它简单到都不需要高等数学,普通人只用10分钟就可以理解,这就是我今天想要介绍的TF-IDF算法。转载 2016-01-09 19:31:00 · 1515 阅读 · 0 评论 -
【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree
QuestionGiven a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined bet原创 2016-01-09 17:43:39 · 502 阅读 · 0 评论 -
【LeetCode】169. Majority Element (多数投票算法 & 算法迁移能力)
Question1Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.You may assume that the array is non-empty and the majority elemen原创 2016-01-09 10:41:55 · 2191 阅读 · 0 评论 -
【每日算法】计数&基数&桶&位图排序-简介
在前面的文章中,我们介绍的都是基于比较的排序。对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的)。本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用。计数排序想象下面这种情况:一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列原创 2016-02-20 12:48:55 · 2274 阅读 · 0 评论 -
【每日算法】排序算法总结(复杂度&稳定性)
一、插入排序:稳定,时间复杂度O(n^2)想象你在打扑克牌,一开始左手是空的,接着右手开始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们需要从右到左将它与手中的牌比较,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。详见: 插入排序二、选择排序:不稳定,时间复杂度O(n^2)每趟从未排序部分选出最小的元素,然后通过交换将其添加到已排序部分中。详见:原创 2016-02-20 16:12:19 · 3124 阅读 · 1 评论 -
C++使用sort排序导致的coredump(Strict Weak Ordering)
当我们需要自定义排序规则时,需要实现一个比较函数,该函数类似如下:bool cmp(int a,int b){ return a>b;}当cmp返回true时,a将会排在b前面,因此上面的函数将从大到小排序。 换句话说,cmp函数重新定义了“小”的概念(当a>b时,a“小于”b),整个序列将按照这个“小”的规则从“小”到“大”排序。前几天同事遇到一个问题:对一组数据从小到大排序,对于值相等的原创 2017-10-15 14:57:40 · 4471 阅读 · 2 评论 -
【C++后台开发面试】STL相关
此部分较为精简,只供面试前联想记忆使用,需要先熟读相关的内容知识才能发挥其作用。推荐书籍《STL源码剖析》(侯捷)。六大组件及其关系 空间配置器、容器、迭代器、算法、仿函数、适配器 内存管理:内存配置和对象构造/析构分开。 使用双层级配置器:第一级直接 malloc,free;第二级内存池(维护 16 个自由链表) 迭代器:一种智能指针 Vector: 动态分配的数组,连续线性空间;原创 2017-05-12 11:34:39 · 5348 阅读 · 0 评论 -
Merkle Tree学习
区块链相关知识,原文转自 http://www.cnblogs.com/fengzhiwu/p/5524324.html/*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为接触时间不长,对Merkle Tree的理解也不是很深入,如果有不对的地方,希望各位大神指正*/Mer转载 2016-11-28 23:22:30 · 5431 阅读 · 0 评论 -
【数据结构】邻接表的几种表示方法——C++描述
指针表示法struct ArcNode //定义边表结点 int adjvex; //邻接点域 ArcNode* next;};struct VertexNode //定义顶点表结点{ int vertex; ArcNode* firstedge;};vector表示法vectorint> v[MAXN];数组表示原创 2015-09-06 22:19:01 · 1112 阅读 · 0 评论 -
【算法设计与数据结构】动态规划入门——URAL 1119 Metro
题目链接 http://acm.timus.ru/problem.aspx?space=1&num=1119题目内容 1119 Metro Time limit: 0.5 second Memory limit: 64 MB Many of SKB Kontur programmers like to get to work by Metro because the原创 2015-09-16 15:57:17 · 1132 阅读 · 0 评论 -
【算法设计与数据结构】URAL 1323. Classmates
题目链接 http://acm.timus.ru/problem.aspx?space=1&num=1323题目大意叶良辰班里有n个人,他想让大家都知道他的大名,但是国庆节大家都回家了,他只能通过电话让自己出名:“你只需要记住,我叫叶良辰,把我的大名告诉你的同学,待我大名远扬,我叶良辰必有重谢!”已知通一次电话需要1分钟,给定m对关系,每对关系中的两个人可以互相通话。原创 2015-10-04 14:57:06 · 967 阅读 · 0 评论 -
【人工智能】八皇后问题-启发式求解
摘要八皇后问题是回溯算法的典型案例,在回溯法中,常常是盲目搜索,耗费过多的搜索时间。在本次实验中,使用了启发式搜索,搜索时不是任取一个分支,而是选择最佳的分支往下搜索。通过定义状态空间、操作规则、搜索策略,我们可以清晰快速地得到原问题的一个解。导言八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个原创 2015-10-11 11:28:50 · 10505 阅读 · 4 评论 -
【人工智能】农夫过河问题
问题描述一农夫带着一头狼,一只羊和一个白菜过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃白菜,只有农夫在时才安全。现欲让所有物品包括农夫都安全过道河对岸,求最佳算法。原创 2015-10-11 12:05:29 · 17216 阅读 · 2 评论 -
【每日算法】图算法(遍历&MST&最短路径&拓扑排序)
图有邻接矩阵和邻接表两种存储方法,邻接矩阵很简单,这里不讨论,下面我们先看看常用的邻接表表示方法。邻接表常用表示方法指针表示法指针表示法一共需要两个结构体:struct ArcNode //定义边表结点 { int adjvex; //邻接点域 ArcNode* next;};struct VertexNode //定义顶点表结点{ int原创 2016-02-28 21:04:49 · 7969 阅读 · 0 评论 -
【每日算法】哈希表(Hash Table)
概述哈希表又称散列表,它用于快速查找。查找,如果能够不经过比较,直接就能得到待查记录的存储位置,那效率必定很高。通过在记录的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key跟唯一的存储位置H(key)对应,那么当我们想查找关键码为k的记录时,直接到H(k)处取即可。这种查找技术叫做散列技术。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,将关键码映射原创 2016-02-25 23:16:42 · 2748 阅读 · 0 评论 -
【每日算法】二叉树的遍历
二叉树特点每个节点最多有两棵子树;二叉树是有序的,即区分左右子树的次序。完全二叉树叶子节点只能出现在最下两层,且最下层的叶子节点都集中在二叉树左侧连续的位置。如果有度为1的节点,只可能有一个,且该节点只有左孩子。二叉树实现这里只讲二叉链表实现,使用C++。templateclass DataType>struct BiNode{ DataTy原创 2016-02-25 00:17:25 · 3611 阅读 · 0 评论 -
【每日算法】链表 & 例题选讲
单链表链表是常用的数据结构,其优点是插入和删除元素时不需要移动,表的容量可扩充,且存储空间可以不连续。另外,由于涉及到指针,所以很受面试官的青睐。本文将主要介绍单链表,并简单介绍下双链表和环形链表,并通过一系列的题目来强化这方面的知识。链表节点的结构:templateclass DataType>struct Node{ DataType data; N原创 2016-02-24 14:55:17 · 2512 阅读 · 3 评论 -
【每日算法】栈&队列
栈和队列栈:后进先出(last-in, first-out, LIFO)队列:先进先出(first-in, first-out, FIFO)栈的实现栈的实现有多种方法,比如静态数组、动态数组以及链表。下面我们先简单介绍一下静态数组的实现方法:我们可以用一个数组s[0…n-1]来实现一个至多有n个元素的栈,使用top来表示栈顶元素的下标,当top = -1时栈为空,当top = n-1时栈满。int原创 2016-02-22 18:10:25 · 2745 阅读 · 1 评论 -
使用两个队列实现一个栈
队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:1.q1和q2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列中。 2.当有元素需要插入时,将插入原创 2016-01-25 21:56:15 · 10767 阅读 · 0 评论 -
【LeetCode】217. Contains Duplicate(sort,hash,map)
QuestionGiven an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every原创 2016-01-08 10:24:12 · 495 阅读 · 0 评论 -
【并行计算】Bitonic Sort(双调排序)基础
双调序列双调序列(Bitonic Sequence)是指由一个非严格增序列X和非严格减序列Y构成的序列,比如序列(23,10,8,3,5,7,11,78)。定义:一个序列a1,a2,…,an是双调序列(Bitonic Sequence),如果: (1)存在一个ak(1≤k≤n), 使得a1≥…≥ak≤…≤an成立;或者 (2)序列能够循环移位满足条件(1)Batcher定理将任意一个长为2n的双原创 2015-10-31 16:22:28 · 17923 阅读 · 2 评论 -
【并行计算】使用MPI实现简单的并行素数筛法
并行素数筛法的几种思路1.每个进程负责剔除一个数的倍数:我们注意到,2的倍数比3多,3的倍数比5多,以此类推,即前几个进程几乎决定了总的执行时间,所以本方法不可能是高效的。2.每个进程负责剔除一定范围内的数的倍数:下面代码所实现的是这一种。/* *Author:张华键 * *Date:2015/10/30 * *本程序用于并行求素数,给定一个整数n(本程序n <= 2^9*10^3),使用原创 2015-10-30 22:23:33 · 8923 阅读 · 1 评论 -
【编程珠玑-读书笔记】用位图解决排序问题--仔细分析问题的重要性
开始读《编程珠玑》,刚看完开篇就觉得很开心。作者从“A Friendly Conversation”讲起,大概是这样子的:一个programmer问作者:“How do I sort a disk file?”于是作者简要介绍了一下如何在磁盘中实现Merge Sort,并建议他先钻研下算法课本。然而programmer关注的是如何解决问题,而不是进一步学习。流行的磁盘排序程序大约10多个函数,200原创 2015-10-28 20:42:29 · 1412 阅读 · 0 评论 -
【算法设计与数据结构】URAL 1167. Bicolored Horses(动态规划求解)
题目链接: http://acm.timus.ru/problem.aspx?space=1&num=1167题目大意:有N匹马,分为黑马和白马,要把他们安排到K个马槽中,最后所有马槽都不能是空的。我们将N匹马排成一列,要求按顺序安排马槽,比如前P1匹马安排在第一个槽,接下来的P2匹马安排在第二个槽。对于某一个马槽,设有i匹黑马和j匹白马,求使得所有马槽的i*j之和最小的方案,输出最小值。思路原创 2015-11-13 11:34:00 · 731 阅读 · 0 评论 -
【随机算法】Miller-Rabin大素数检测算法(蒙特卡罗方法)
费马小定理 假如p是质数,且(a,p)=1,那么 a^(p-1)≡1(mod p)。 即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。算法1 事实上,质数一定满足以上条件,但是满足以上条件的不一定是质数。 但是我们还是先利用这个性质来判断一个数N是否为素数。首先我们看一下算法1:bool prime(int n){ 随原创 2015-10-26 21:23:33 · 4399 阅读 · 0 评论 -
【随机算法】蒙特▪卡罗方法初识
随机算法随机算法分为两类:蒙特卡罗和拉斯维加斯蒙特卡罗指的是算法的时间复杂度固定,然而结果有一定几率失败;拉斯维加斯指的是算法一定成功,然而运行时间是概率的;蒙特卡罗方法蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数原创 2015-10-26 19:58:52 · 2051 阅读 · 0 评论 -
【编程珠玑-读书笔记】算法设计技术—以求解"最大连续子序列和"为例
在一些情况下,算法的设计对程序的性能起着很大的作用,因此在有些时候,我们不得不多花一些时间在算法的设计上。当然,算法的设计不是一言两语能讲清楚的,本章节作者通过对一个小问题进行研究,提出了4种不同的算法,为我们展示了在算法设计中的一些技术。问题描述input:一个具有n个浮点数字的序列x;output:最大连续子序列和;方案1:暴力遍历看到这个问题,我想最最简单的思路就是遍历了!maxsofar =原创 2015-11-07 22:24:59 · 905 阅读 · 2 评论 -
RSA算法原理
历史1976年以前,所有的加密方法都是同一种模式:(1)甲方选择某一种加密规则,对信息进行加密;(2)乙方使用同一种规则,对信息进行解密。由于加密和解密使用同样规则(简称”密钥”),这被称为”对称加密算法”(Symmetric-key algorithm)。这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。1976年,两位美国计算机学家Whi原创 2015-10-22 21:33:13 · 2847 阅读 · 0 评论 -
【算法设计与数据结构】三分法:求单峰函数的极值
介绍三分法的思路与二分法很类似,不过其用途没有那么广泛,主要用于求单峰函数的极值。示例代码void Solve(){ double left, right, m1, m2, m1_value, m2_value; left = MIN; right = MAX; while (left + EPS < right) { m1 = left +原创 2015-10-21 23:18:12 · 2808 阅读 · 0 评论 -
【算法设计与数据结构】欧几里得算法、拓展欧几里得算法
欧几里得算法求最大公约数//递归版本int gcd (int a, int b){ if (b == 0) return a; else return gcd(b, a%b);}//非递归版本//辗转相除法while (m % n){ int tmp = m; m = n; n = tmp % n;}return原创 2015-10-22 00:07:33 · 947 阅读 · 0 评论