算法与数据结构
文章平均质量分 59
Dev-L
这个作者很懒,什么都没留下…
展开
-
归并排序/逆序数组对问题
题目出自Coursera Stanford 算法课程Week 2的Test :给定一个乱序的长100000的整数数组A,其元素值分别存放在data.txt的每一行中,各元素互不相等。求数组A中逆序对的数目。要求使用分治算法。其实解法就是将归并排序实现一遍,在归并(Merge)的时候引入计数器,统计逆序对数目。下面是C++ Code:#include <stdio.h>#include <vecto原创 2017-05-28 11:48:43 · 333 阅读 · 0 评论 -
陈越姥姥 数据结构 线性表 实现
顺序表typedef int Position;typedef struct LNode *List;struct LNode { ElementType Data[MAXSIZE]; Position Last;};/* 初始化 */List MakeEmpty(){ List L; L = (List)malloc(sizeof(struct LNode原创 2017-10-19 17:25:43 · 737 阅读 · 0 评论 -
背包九讲(附Cpp代码)
文档链接:http://love-oriented.com/pack/pack2alpha1.pdf1. 01背包1)题目:有n件物品和一个容量为v的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大2)输入:测试用例数 物品数 背包大小 n个物品的ci和wi3)代码:#include原创 2017-10-21 10:37:31 · 507 阅读 · 0 评论 -
单调队列---滑窗法
问题来源给定一个长度为N的整数数列a(i),i=0,1,…,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0,1,...,N-1问题的另一种描述就是用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值。解法一:很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗最后移一个单原创 2017-10-21 11:12:08 · 613 阅读 · 0 评论 -
链表面试题总结 C/C++
数据结构和算法,是我们程序设计最重要的两大元素,可以说,我们的编程,都是在选择和设计合适的数据结构来存放数据,然后再用合适的算法来处理这些数据。 在面试中,最经常被提及的就是链表,因为它简单,但又因为需要对指针进行操作,凡是涉及到指针的,都需要我们具有良好的编程基础才能确保代码没有任何错误。 链表是一种动态的数据结构,因为在创建链表时,我们不需要知道链表的长度,原创 2017-11-02 11:03:51 · 2218 阅读 · 0 评论 -
陈越姥姥 数据结构之树
二叉树的遍历先序遍历void PreorderTraversal( BinTree BT ){ if( BT ) { printf("%d ", BT->Data ); PreorderTraversal( BT->Left ); PreorderTraversal( BT->Right ); }}中序遍历void Inor原创 2017-10-26 15:48:50 · 2853 阅读 · 0 评论 -
递归练习(一)
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const char *原创 2017-11-04 19:34:25 · 564 阅读 · 0 评论 -
递归练习(二)
题目 1:数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。如n=3,m=2时,输出:12 13 23#include int Function(int n,int m,int a[],int depth,int output[],int size,int x) //n即指有n个数,m为从n个数中选取的个数,a[]为所选取的数组,depth递归进入深度,ou原创 2017-11-04 19:51:09 · 1121 阅读 · 0 评论 -
【算法】动态规划笔记-----柳婼 の blog
动态规划:将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解动态规划会将每个求解过的子问题的解记录下来,这样下一次碰到同样的子问题时,就可以直接使用之前记录的结果,而不是重复计算可以用递归或者递推的写法实现,递归的写法又叫记忆化搜索重叠子问题:如果一个问题可以被分解成若干个子问题,且这些子问题会重复出现,就称这个问题拥有重叠子问题。 一个问题必须拥有重叠子问题,才转载 2017-10-17 22:08:59 · 1863 阅读 · 0 评论 -
最长回文子串的解法
1、暴力法 最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。 求每一个子串时间复杂度O(N^2),判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。string findLongestPalindrome(string &s) { int length=s.size();//字符串长度 int maxlength=转载 2017-09-19 11:52:13 · 384 阅读 · 0 评论 -
快速排序C++实现
快速排序为原址排序,无需分配额外的Temp内存,且期望时间复杂度为O(nlgn),可以通过交换数组中的第一个元素和随机一个元素的位置,达到随机化的目的,避开 bad case。下面是C++实现,原数组元素存放在data.txt文件中:选取第一个元素为主元#include <stdio.h>#include <vector>#include <iostream>#include <fstre原创 2017-05-29 11:28:10 · 456 阅读 · 0 评论 -
选择排序C++实现
算法描述选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。时间复杂度: O(n^2)空间复杂度: O(1)稳定性: 不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第原创 2017-05-29 17:44:06 · 450 阅读 · 0 评论 -
插入排序C++实现
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。待插入的位置 应该是第一个比带插入数值大的元素所在的位置,可以想象一下玩纸牌接完牌整原创 2017-05-29 18:48:25 · 465 阅读 · 1 评论 -
冒泡排序C++实现
冒泡排序貌似是最简单的排序方法了,因为其破解时间复杂度为O(n^2),在数组比较大的时候,很少用到。其思想是:将但既然简单,也就简单的实现以下,只当是练习了一遍打字 ^_^ 还是直接贴代码://冒泡排序void BubbleSort(vector<int> &a){ int i,j; for (i=0;i<a.size();i++) //每次循环确定一个最大值 {原创 2017-05-29 19:42:19 · 752 阅读 · 0 评论 -
堆排序原理及算法实现(最大堆)
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2] 或者Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[原创 2017-05-29 23:06:24 · 920 阅读 · 0 评论 -
计数排序及其C++实现
计数排序 COUNTING_SORT计数排序假设n个输入元素中每一个都是在0到k区间内的一个整数。其中k为某个整数。当k=O(n)时,排序的运行时间为Θ(n).计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接吧x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则x就应该在第18个输出位置上。当有几个元素位置相同时,这一方案要略作修改。因为不能把他们原创 2017-05-30 21:56:55 · 3152 阅读 · 0 评论 -
大数乘法的分治策略C++实现
最近学习Coursera上的算法课,刚开始接触分治算法(Divide & Conquer),第一周的测试题为两个大位整数的乘法,结合自己自学的弱爆的C++,各种查资料还调了一整天的Bug才写出来个不完整的东西。只怪自己平时代码敲得少,不熟练。很多bug遇到过就会对此很敏感,所以多去造轮子,多尝试自己去实现才是最快的学习方法。哈哈哈,一堆废话,自勉之~下面是自己写的源码,其中还有许多不妥的地方,第一次原创 2017-05-26 21:11:02 · 1219 阅读 · 0 评论 -
已知二叉树的中序和前序序列(或后序)求解树
转自:http://www.cnblogs.com/bmrs/archive/2010/08/19/SloveTree.html这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的,证明略。一、已知二叉树的前序序列和中序序列,求解树。1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。2、求解树的子树。找出根节点在原创 2017-09-19 10:44:45 · 834 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)简介
在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash原创 2017-11-16 12:11:27 · 281 阅读 · 0 评论