随笔分类 -  算法与数据结构

摘要:昨天参加了2013年阿里巴巴实习生校园招聘的笔试。其中有一道题似曾相识,在快交卷的时候才隐约回想起这是一个数学问题。但具体怎么做的却想不起来了。为了避免再次遗忘,所以还是动手自己再写一写吧。题目参考:http://blog.csdn.net/hnmjiayou/article/details/8887127解法参考:http://blog.sina.com.cn/s/blog_75683c7f0100q4va.html代码参考:http://50vip.com/blog.php?i=223有一个淘宝卖家,他在全国有n个仓库,这n个仓库正好构成一个环形,如下图一所示,开始他所有仓库的货物数是不等 阅读全文
posted @ 2013-05-06 21:43 busyfruit 阅读(492) 评论(0) 推荐(0)
摘要:一、“0-1背包”问题描述: 给定n中物品,物品i的重量是wi,其价值为vi,背包的容量为c.问应如何选择装入背包中的物品,使得装入背包中的物品的总价值最大? 形式化描述:给定c>0,wi>0,vi>0,1≤i≤n,要求找一个n元0-1向量(x1,x2,...,xn),xi∈{0,1},1≤i≤n,使得∑wixi≤c,而且∑vixi达到最大。因此0-1背包问题是一个特殊的整形规划问题: max∑vixi s.t ∑wixi≤c xi∈{0,1},1≤i≤n二、动态规划求解(两种方法,顺... 阅读全文
posted @ 2013-04-25 20:06 busyfruit 阅读(5020) 评论(0) 推荐(1)
摘要:关于最大字段和,已有4中方法对其进行求解,现对其进行扩展,得到两个扩展的问题: 一、最大子矩阵问题 1、问题描述:给定一个m行n列的子矩阵A,试求出矩阵A的一个子矩阵,使其各元素之和为最大。 2、求解策略:对该问题,如果用穷举法求解,时间复杂度将为O(m2n2),利用其为最大字段和问题的扩展,将其划归成最大字段和问题,然后再用最大字段和的最优方法进行求解,则可降低时间复杂到O(m2n) 。即先长度为m的维度上求出第i行到第j行每一个的元素和存储到一个n维的数组中,再对该数组进行最大字段和的动态规划法求解,求出结果。 3、程序如下所示:float maxSum2(float (*a)... 阅读全文
posted @ 2013-04-22 15:39 busyfruit 阅读(1665) 评论(0) 推荐(0)
摘要:一、对于最接近0的字段和求解1、最接近0就相当于字段和的绝对值最小,此时问题等价于求绝对值最下的字段和。针对此,可以设置一个绝对值结构体,结构如下:struct absVal { float value; //绝对值 bool flag; //标志位,true表示为非负数,否则为负数}; 这样,可以将最简单的扫描算法改写成如下:简单法求最接近0的字段和float maxSum_easy(int n, int* a, int& besti, int& bestj) //最简单的方法,复杂度为O(n^3){ int i = 0, j = 0, k = 0, sum =... 阅读全文
posted @ 2013-04-17 15:19 busyfruit 阅读(371) 评论(0) 推荐(0)
摘要:求最大字段和的算法很好的讲解了算法设计技术。根据《编程珠玑》上的描述,简单实现各种不同的算法。如下:1、最简单的方法:对所有满足0≤i≤j<n的(i,j)整数进行迭代。对每个整数对,都计算x[i..j]的总和:简单方法int maxSum_easy(int n, int* a, int& besti, int& bestj) //最简单的方法,复杂度为O(n^3){ int maxSoFar = 0, i = 0, j = 0, k = 0, sum = 0; for (i = 0; i < n; ++i) for ( j = i; j < n; ++j) . 阅读全文
posted @ 2013-04-15 00:27 busyfruit 阅读(498) 评论(0) 推荐(1)
摘要:时间限制: 1000ms 内存限制: 256MB描述Alice和Bob还有其他几位好朋友在一起玩传话游戏。这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位。然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位……以此类推,直到倒数第二位告诉Bob。两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释。最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家。由于传话过程中可能出现一些偏差,游戏者越多,Bob最后听到的话就与Alice所想的越不同。Bob听到的话往往会变成一些很搞笑的东 阅读全文
posted @ 2013-04-09 20:19 busyfruit 阅读(830) 评论(0) 推荐(0)
摘要:希尔排序(Shell's Sort)又称缩小增量排序,类属于插入排序。考虑到直接插入排序得一下特点: (1)在待排序数基本有序情况下排序效率大大提高; (2)在n很小时,其排序效率也很高。 基于以上考虑,对直接插入排序进行改进,并得出希尔排序。其基本思想为:先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序时”,再对全体记录进行一次插入排序。 这里的子序列是通过一个增量得到的,每一次赋予不同的增量,则得到不同的子序列组(分别对子序列进行直接插入排序就称作一次希尔插入排序,注意,实际代码中并不是依次排好一个自序列之后再排下一个这样效... 阅读全文
posted @ 2013-04-07 11:11 busyfruit 阅读(600) 评论(0) 推荐(0)
摘要:(radixsort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是 阅读全文
posted @ 2013-03-19 22:58 busyfruit 阅读(988) 评论(0) 推荐(0)
摘要:计数排序是3大非比较排序(计数、基数及桶排序)之一,其基本原理是利用额外的存储空间(计数数组)对每个元素进行计数并将之存储到新的数组中(牺牲空间换时间)。此处的关键是计数数组的下标是原数据的元素值,即利用原数据的关键之进行索引(类似于hash表的索引)。其时间复杂度为Θ(n+k),即Θ(n)。注意,此处的计数排序时稳定排序算法(这是为什么step3从后往前扫描的原因)。 主要有3个步骤: step1:记录待排序集合A中的每一个元素i具有的个数,存放到计数数组C[i]中 step2:在C的相应位置处确定不比该位置大的数据个数 step3:从大到小依次扫描原数据,将其存储到... 阅读全文
posted @ 2013-03-19 11:30 busyfruit 阅读(335) 评论(0) 推荐(0)
摘要:参考算法导论、数据结构相关书籍,写得最小堆实现的源代码如下: 1 // 2 //--最小堆实例 3 // 4 5 #include <iostream> 6 #include <vector> 7 #include <string> 8 using namespace std; 9 10 template<typename Comparable> 11 class minHeap 12 { 13 public: 14 explicit minHeap(int capacity = 0);//显示构造函数,只能用于对象的构造而不能用于隐式转换 15 阅读全文
posted @ 2012-12-29 21:39 busyfruit 阅读(2071) 评论(0) 推荐(0)
摘要:#include<iostream>#include <cmath>#include<vector>using namespace std;template <class T>void max_heap(T* heap, int i) //heap[0]存储堆的大小{ int l=2*i; //l为左孩子的结点编号 int r=2*i+1; //r为右孩子的结点编号 int largest=i; int heap_size=heap[0]; T temp; if(l<=heap_size && heap[l]>heap 阅读全文
posted @ 2012-12-25 00:35 busyfruit 阅读(271) 评论(0) 推荐(0)
摘要:参考算法导论,得出源程序如下:////动态规划法求最长公共子序列,参考算法导论15.4//#include<iostream>#include <vector>using namespace std;void lcs_length(const vector<char>& X, const vector<char>& Y, vector<vector<int> >& c, vector<vector<char> >& b) //X[1..m],Y[1..n],c[0.. 阅读全文
posted @ 2012-12-25 00:29 busyfruit 阅读(488) 评论(0) 推荐(0)
摘要:人工智能实验时写的代码: 1 //shudu.cpp 数独游戏 2 #include<iostream> 3 #include<iomanip> 4 #include<fstream> 5 #include<cstdlib>//c语言中为#include<stdlib.h> 6 usingnamespace std; 7 8 //定义数据结构 9 int shudu[9][9]={0}; 10 11 //初始化数据 12 void init() 13 { 14 int i=0,j=0; 15 ifstream fin("in 阅读全文
posted @ 2011-02-27 15:43 busyfruit 阅读(8002) 评论(0) 推荐(0)