Algorithm
文章平均质量分 76
OopspoO
be better
展开
-
0x01算法设计与分析复习(一):算法和算法分析
参考书籍:算法设计与分析——C++语言描述(第二版)算法问题求解基础1. 算法概述算法(algorithm)是求解一类问题的任意一种特殊的方法。教严格的说法是,一个算法是对特定问题求解步骤的一种描述,它是指令的有限序列。 算法具有下面五个特征:输入(input):算法有零个或多个输入量输出(output):算法至少产生一个输出量确定性(definitenes...原创 2018-01-08 20:32:03 · 2301 阅读 · 0 评论 -
0x00数据结构——C语言实现(双链表)
0x00数据结构——C语言实现(双链表)/*filename:double_linked_list.h*//* 双链表(double linked list) Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 返回附加头结点的地址 搜索函数:找x在表中的位置,返回表项位置 定位函数...原创 2018-04-23 21:12:47 · 288 阅读 · 0 评论 -
0x00数据结构——C语言实现(单链表)
0x00数据结构——C语言实现(单链表)/*filename:singly_linked_list.h*//* 单链表(singly linked list)是一种最简单的链表表示,也叫做线性链表。 用它来表示线性表时,用指针表示结点间的逻辑关系。 Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 ...原创 2018-04-23 21:09:23 · 399 阅读 · 0 评论 -
0x0a算法设计与分析复习(三):求解困难问题
参考书籍:算法设计与分析——C++语言描述(第二版)求解困难问题求解困难问题NP完全问题不确定算法和不确定机不确定算法的抽象机模型不确定算法时间复杂度P类和NP类问题NP难度和NP完全问题Cook定理一些典型的NP完全问题小结随机算法基本概念近似算法基本概念绝对性能保证相对性能保证近似方案密码算法NP完全问题多项式时间算法: 对规模为n的输入,它们在最坏情况下的原创 2018-01-10 10:53:27 · 776 阅读 · 0 评论 -
0x00数据结构——C语言实现(单向循环链表)
0x00数据结构——C语言实现(单向循环链表)/*filename:circular_list.h*//* 循环链表(circular list)是另一种形式的表示线性表的链表,与单链表不同的是, 表尾结点的link域中不是NULL而是存放指向链表开始结点的指针。 Functions: 创建一个空线性表 计算表长度 返回附加头结点的地址 搜索函数:...原创 2018-04-23 21:16:54 · 404 阅读 · 0 评论 -
0x00数据结构——C语言实现(双向循环链表)
0x00数据结构——C语言实现(双向循环链表)/* 循环双链表 Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 返回附加头结点的地址 搜索函数:找x在表中的位置,返回表项位置 定位函数:返回第i个表项在表中的位置 取第i个表项的值 用x修改第i个表项的内容 ...原创 2018-04-23 21:18:47 · 269 阅读 · 0 评论 -
0x01数据结构——C语言实现(二叉查找树)
0x01数据结构——C语言实现(二叉查找树)二叉查找树是一种特殊的二叉树,使二叉树成为二叉查找树的性质是:对于树中的每一个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。这意味着,该树所有的元素可以用某种统一的方式排序。二叉查找树的C语言实现:b_search_tree.h#ifndef B_SEARCH_TREE_H#def...原创 2018-07-01 14:55:33 · 408 阅读 · 0 评论 -
0x01数据结构——C语言实现(二叉树)
0x01数据结构——C语言实现(二叉树)二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的儿子。二叉树的一个性质是平均二叉树的深度要比N小得多,这个性质有时很重要。分析表明,这个平均深度为O(N−−√)O(N)O(\sqrt{N}),而对于特殊类型的二叉树,即二叉查找树(binary search tree),其深度的平均值是O(logN)O(logN)O(\log...原创 2018-07-01 14:38:41 · 281 阅读 · 0 评论 -
0x01数据结构——C语言实现(树)
0x01数据结构——C语言实现(树)树(tree): 一棵树是一些节点的集合。这个集合可以是空集;若非空,则一棵树由称为根(root)的节点r以及0个或多个非空的(子)树T1T1T_1,T2T2T_2,…,TkTkT_k组成,这些子树种每一颗的根都被来自根r的一条有向边(edge)所连接。每一棵子树的根叫做根r的儿子(child),而r是每一棵子树的根的父亲(parent)。从节点n1n...原创 2018-07-01 14:37:51 · 664 阅读 · 0 评论 -
最大子序列求和问题
最大子序列求和问题问题描述给定整数A1A1A_1,A2A2A_2,…, ANANA_N(可能有负数),求∑jk=iAk∑k=ijAk\sum_{k=i}^jA_k的最大值(为方便起见,如果所有整数均为负数,则最大子序列和为0)。求解算法1:int max_sub_sum(const int A[], int N){ int sum, maxsum,i,j,...原创 2018-06-23 17:29:52 · 954 阅读 · 0 评论 -
分治法求解最大子数组问题
/*最大子数组问题给出每天股票的价格,求出买进和卖出的时间,使得获利最高。输入: P[0~n-1]输出: 买进的时间i和卖出的时间j(0<=i<=j<=n-1)*///分治法求解,将数组P转换为数组A,其中A中每个元素A[i]=P[i]-p[i-1],表示第i-1天买进,第i天卖出的获利。//那么第i天买进第j天卖出的获利可以表示为A[i+1]+...+A[j],...原创 2018-06-23 17:27:53 · 986 阅读 · 0 评论 -
0x00数据结构——C语言实现(队列)
0x00数据结构——C语言实现(队列)实现/*使用队列时,插入在一端进行而删除在另一端进行队列的基本操作是入队(enqueue),它是在表的末端(队尾(rear))插入一个元素,还有出队(dequeue),它是删除(或返回)在表的开头(队头(front))的元素。 dequeue(Q) enqueue(Q,X) ...原创 2018-04-25 16:39:54 · 1081 阅读 · 0 评论 -
0x00数据结构——C语言实现(栈+后缀表达式计算)
0x00数据结构——C语言实现(栈)栈的实现/* 栈(tack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。 对栈的基本操作有Push(进栈)和Pop(出栈)。 Functions: (在链表中增加附加头结点的版本) 创建一个空栈 将栈置为空 计算栈长度 返回栈的地址 栈push操作函数 栈...原创 2018-04-25 14:08:33 · 1764 阅读 · 0 评论 -
0x00数据结构——C语言实现(多项式)
0x00数据结构——C语言实现(多项式)/*filename:polynomial*/#ifndef POLYNOMIAL#define POLYNOMIAL//一元多项式的表示//Pn(x)=p0 + p1*x + p2*x^2 + ... + pn*x^n/*基本操作: 创建一个有m项系数和指数的一元多项式p 销毁一元多项式p 打印输出 ...原创 2018-04-24 16:29:33 · 2171 阅读 · 0 评论 -
0x09算法设计与分析复习(二):算法设计策略-分枝限界法3
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分枝限界法批处理作业调度问题描述设有n个作业的集合{0,1,⋯,n−1}\{0,1,\cdots,n-1\},每个作业有两个项任务要求依次在两台设备P1P_1和P2P_2上完成,aia_i和bib_i分别表示作业i在设备P1P_1和P2P_2上的处理时间。批处理作业调度问题是求使得所有作业的完成时间之和FT(S)=∑n−1i=0fi原创 2018-01-10 10:52:19 · 292 阅读 · 0 评论 -
0x05算法设计与分析复习(二):算法设计策略-分治法1
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分治法分治法分治法的基本思想分治法就是分而治之,一个问题能够用分治法求解的要素是:第一,问题能够按照某种方法分解成若干个规模较小,相互独立且与原问题类型相同的子问题;第二,子问题足够小时可以直接求解;第三,能够将子问题的解组合成原问题的解。由于分治法要求分解成同类子问题,并允许不断分解,使问题...原创 2018-01-08 20:34:44 · 434 阅读 · 0 评论 -
0x07算法设计与分析复习(二):算法设计策略-动态规划法4
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-动态规划法最优二叉搜索树问题描述二叉搜索树运算有很好的平均时间复杂度(O(lognO(\log n),但可能会产生退化的树形,是搜索时间变坏。二叉平衡树限制了输的高度,使搜索运算的最坏情况时间位O(logn)O(\log n)。以上分析均假定二叉搜索树上搜索一个元素的概率是相等的。如果元素集合是固定原创 2018-01-09 11:03:42 · 420 阅读 · 0 评论 -
0x07算法设计与分析复习(二):算法设计策略-动态规划法5
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-动态规划法流水作业调度问题描述假定处理一个作业需要执行若干项不同类型的任务,每一类任务只能在某一台设备上执行。设一条流水线上有n个作业J={J0,J1,⋯,Jn−1}J=\{J_0,J_1,\cdots,J_{n-1}\}和m台设备P={P1,P2,⋯,Pm}P=\{P_1,P_2,\cdots,P_m原创 2018-01-09 11:04:34 · 569 阅读 · 0 评论 -
0x08算法设计与分析复习(二):算法设计策略-回溯法1
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-回溯法回溯法是比贪心法和动态规划法更一般的方法,回溯法是一种通过搜索状态空间树来求问题的可行解或最优解的方法。回溯法使用约束函数和限界函数来压缩需要实际生成的状态空间树的结点数,从而大大节省问题的求解时间。通常情况下,回溯法是为了找出满足约束条件的所有可行解。回溯法基本概念显示约束和解空间使原创 2018-01-09 11:06:23 · 1786 阅读 · 0 评论 -
0x08算法设计与分析复习(二):算法设计策略-回溯法2
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-回溯法子集和数问题描述已知n个不同的正数wi(0≤i≤n−1)w_i(0\leq i\leq n-1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等于另一个给定的正数MM。回溯法求解对于子集和数问题问题,可采用两种不的解结构形式:可变长度元组和固定长度元组。采用可变长原创 2018-01-09 11:07:14 · 798 阅读 · 0 评论 -
0x08算法设计与分析复习(二):算法设计策略-回溯法3
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-回溯法0/1背包问题描述回溯法求解限界函数0/1背包算法批处理作业调度问题描述设有n个作业的集合{0,1,⋯,n−1}\{0,1,\cdots,n-1\},每个作业有两项任务,要求分别在两台设备P1P_1和P2P_2上完成。每个作业必须现在P1P_1上加工,然后再原创 2018-01-09 11:08:02 · 358 阅读 · 0 评论 -
0x09算法设计与分析复习(二):算法设计策略-分枝限界法1
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分枝限界法一般而言,回溯法的求解目标是在状态空间树上找出满足约束条件的所有解,而分枝限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出最优解。分枝限界法分枝限界法概述相关概念: + 未访问状态:结点尚未访问的状态; + x**未检测状态**:x已访问但其后继未访问; +原创 2018-01-09 11:09:34 · 1876 阅读 · 0 评论 -
0x09算法设计与分析复习(二):算法设计策略-分枝限界法2
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分枝限界法带时限的作业排序问题描述对于单机处理机的带时限作业排序问题,如果每一个作业具有相同的处理时间,则可以用贪心法求解。如果每个作业的处理时间允许不同,带时限的作业排序问题可描述为:设有n个作业和一台处理器,每个作业所需的处理时间、要求的时限和收益可用三元组(ti,di,pi),0≤in(t_i,d原创 2018-01-09 11:10:39 · 1150 阅读 · 0 评论 -
0x01算法设计与分析复习(一)习题解答
参考书籍:算法设计与分析——C++语言描述(第二版)练习一逆序输出正整数的各位数(递归算法求解)#include <stdio.h>//逆序输出正整数的各位数(递归算法求解)void print(unsigned int n){ printf("%d", n%10);//基础情况 if(n>=10){ print(n/10);//递归部分 }}原创 2018-01-09 10:57:24 · 2576 阅读 · 0 评论 -
0x07算法设计与分析复习(二):算法设计策略-动态规划法3
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-动态规划法矩阵连乘问题描述给定n个矩阵{A0,A1,⋯,An−1}\{A_0,A_1,\cdots,A_{n-1}\},其中Ai(i=0,⋯,n−1)A_i(i=0,\cdots,n-1)的维数为pi×pi+1p_i\times p_{i+1},并且AiA_i与Ai+1A_{i+1}是可乘的。考虑这n个原创 2018-01-09 11:01:04 · 287 阅读 · 0 评论 -
0x07算法设计与分析复习(二):算法设计策略-动态规划法2
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-动态规划法资源分配问题资源分配问题将n个资源分配给r个项目,已知如果把j个资源分配各第i个项目,可以收益N(i,j),0≤j≤n,1≤i≤rN(i,j),0\leq j\leq n,1\leq i\leq r,求总收益最大的资源分配方案。这一问题可以用一个多段图来描述,多段图共分为r+1r+1阶段,原创 2018-01-09 11:00:11 · 527 阅读 · 0 评论 -
0x05算法设计与分析复习(二):算法设计策略-分治法2
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分治法二分搜索问题描述在有序表(已按关键字值非减排序)中搜索给定元素的问题。分治法求解设有一个长度为n的有序表(a0,a1,⋯,an−1)(a_0,a_1,\cdots,a_{n-1}),要求在表中搜索与给定元素x有相同关键字值的元素。若n=0n=0,则显然搜索失败;若n>0n>0,则可将有原创 2018-01-08 20:35:28 · 556 阅读 · 0 评论 -
0x05算法设计与分析复习(二):算法设计策略-分治法3
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分治法排序问题问题描述排序是将一个元素序列调整为按指定关键字值的递增(或递减)次序排列的有序序列。 分治法求解分治法求解排序问题思想:按某种方式将序列分成两个或多个子序列,分别进行排序,再将已排序的子序列合并成一个有序序列。合并排序和快速排序是两种典型的符合分治策略的排序算法。...原创 2018-01-08 20:36:14 · 328 阅读 · 0 评论 -
0x05算法设计与分析复习(二):算法设计策略-分治法4
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-分治法选择问题问题描述选择问题(select problem)是指在n个元素的集合中,选出某个元素值大小在集合中处于第k位的元素,即所谓的求第k小元素问题(Kth-smallest)。分治法求解如果使用快速排序中所采用的选取主元的分划方法,以主元为基准,将一个表划分为左右两个子表。设原表的长原创 2018-01-08 20:36:53 · 745 阅读 · 0 评论 -
0x06算法设计与分析复习(二):算法设计策略-贪心法1
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-贪心法贪心法贪心法是一种求解最优化问题的算法设计策略。 贪心法是通过分步决策(stepwise decision)的方法来求解问题的。贪心法在求解问题的每一步上做出某种决策,产生n-元组解的一个分量。贪心法要求根据题意,选定一种最优量度标准(optimization criterion)或贪心准则(gree原创 2018-01-08 20:37:38 · 1154 阅读 · 0 评论 -
0x06算法设计与分析复习(二):算法设计策略-贪心法2
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-贪心法带时限的作业排序问题描述带时限得到作业排序问题:设有一个单机系统、无其他资源限制且每一个作业运行时间相等,假定每一个作业运行1个单位时间。现在有n个作业,每一个作业都有一个截止期限di>0,did_i>0,d_i为整数。如果作业能够在截止期限之内完成,可获得Pi>0P_i>0的收益。问题要求得到一原创 2018-01-08 20:40:42 · 679 阅读 · 0 评论 -
0x06算法设计与分析复习(二):算法设计策略-贪心法3
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-贪心法最小代价生成树问题描述一个无向连通图的生成树是一个极小连通子图,它包括图中全部的结点,并且尽可能少的边。遍历一个连通图得到图的一颗生成树。一颗生成树的代价是树中各条边上的代价之和。一个网络的各个生成树中,具有最小代价的生成树称为该网络的最小代价生成树(minimum-cost spanning原创 2018-01-08 20:41:23 · 678 阅读 · 0 评论 -
0x06算法设计与分析复习(二):算法设计策略-贪心法4
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-贪心法单源最短路径问题描述单源最短路径问题是:给定带权的有向图G=(V,E)G=(V,E)和图中结点s∈Vs\in V,求从s到其余各结点的最短路径,其中s称为源点。这里所指的路径长度是指路径上的边所带的权值之和,并假定边上的权值为非负值。贪心法求解从源点到另一个结点的任意一条路径均可看成是原创 2018-01-08 20:42:11 · 383 阅读 · 0 评论 -
0x07算法设计与分析复习(二):算法设计策略-动态规划法1
参考书籍:算法设计与分析——C++语言描述(第二版)算法设计策略-动态规划法动态规划法动态规划算法是另一种求解最优化问题的重要算法设计策略。对于一个问题,如果能从较小规模的子问题的最优解求得较大规模同类子问题的最优解,最终得到给定问题的最优解,这就是最优解的最优子结构特性。最优子结构特性使动态规划算法可以采用自底向上的方式进行计算,如果能在求解中保存已计算的子问题的最有解,当原创 2018-01-08 20:44:11 · 935 阅读 · 0 评论 -
粒子群算法PSO
粒子群算法PSO##简介粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生...原创 2019-03-07 18:04:56 · 4479 阅读 · 1 评论