算法设计
文章平均质量分 73
化理论为实践,将理论、伪代码使用Java代码进行实现
绿豆蛙给生活加点甜
人们总爱追问人生的意义,其实人生本无所谓意义,因为存在先于本质,本质之前的存在是禁绝思考的。人生的无意义赋予了人的自由,倘若人生有一个注定的意义,那么人人都如同一具机器。
展开
-
生成素数——埃氏筛、线性筛、奇数筛从理论到实践
目录生成素数的三大法宝埃氏筛理论Java实现线性筛理论Java实现奇数筛理论Java实现生成素数的三大法宝埃氏筛理论埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。过程:要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,原创 2022-04-04 17:22:36 · 491 阅读 · 4 评论 -
超越算法能力的极限——回溯法
回溯法回溯法的前世今生我们可以把回溯法看作穷举查找的一个改进。但和穷举查找不同的是,它每次只构造候选解的一个分量,然后评估这个部分构造解:如果加上剩下的分量也不可能求得一个解,就绝对不会生成剩下的分量。虽然在最坏的情况下,我们还是需要面对穷举查找中遇到的指数级爆炸问题,但这种方法使我们至少可以对某些组合难题的较大实例求解。回溯法是以构造一棵状态空间树为基础的,树的节点反映了对一个部分解所做的特定选择。如果可以保证,节点子孙所对应的选择不可能得出问题的一个解,该技术就会立即停止处理这个节点。对于回溯法来原创 2022-04-04 00:46:52 · 980 阅读 · 0 评论 -
分治法——凸包问题
凸包问题相关解读Java代码package com.算法.分治法;import java.util.*;/** * @Author Lanh **/public class 凸包问题 { public static void main(String[] args) { int[][] matrix = {{12,5},{23,1},{3,27},{65,4},{2,5},{5,3},{3,7},{5,7}}; List<Node>原创 2022-03-24 20:13:41 · 1083 阅读 · 0 评论 -
分治法——最近对问题
最近对问题令P为笛卡儿平面上n>1个点构成的集合。简单起见,假设集合中的每个点都不一样。我们还假设这些点是按照其x轴坐标升序排列的。(如果不是这样,可以事先用类似合并排序这样的高效算法对其排序。)为了更加方便,我们还可以按照点的y轴坐标在另一个列表中进行升序排列,并将这个列表示为Q。当2≤n≤3时,问题就可以通过蛮力算法求解。当n>3时,可以利用点集在x轴方向上的中位数m,在该处作一条垂线,将点集分成大小分别为⌈n/2⌉和⌊n/2⌋\lceil n/2 \rceil 和\lfloor n/2原创 2022-03-24 13:48:40 · 3658 阅读 · 0 评论 -
分治法——大整数乘法
大整数乘法某些应用,尤其是当代的密码技术,需要对超过100位的十进制整数进行乘法运算。显然,因为这样的整数过于长,现代计算机的一个“字”是装不下的,所以我们需要对它们做特别的处理。这就是研究高效的大整数乘法算法的现实需求。在本节中,我们会介绍一个对这种数做乘法的有趣算法。显然,如果我们使用经典的笔算算法来对两个位整数相乘,第一个数中的n个数字都分别要被第二个数中的n个数字相乘,这样就一共要做n次位乘(如果一个数的位数比另一个数少,我们可以在较短的数前补零,使得两个数的位数相等)。虽然看上去,设计一个乘法次原创 2022-03-18 15:48:08 · 672 阅读 · 0 评论 -
分治法——合并排序(归并排序)
合并排序(归并排序)合并排序是成功应用分治技术的一个完美例子。对于一个需要排序的数组A[0…n-1],合并排序把它一分为二:A[0..⌊n/2⌋−1]和A[⌊n/2⌋..n−1]A[0..\lfloor n/2 \rfloor -1]和A[\lfloor n/2 \rfloor ..n-1]A[0..⌊n/2⌋−1]和A[⌊n/2⌋..n−1],并对每个子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组。对两个有序数组的合并(merging)可以通过merge的算法完成。初始状态下,两个指针(数原创 2022-03-18 00:22:23 · 1779 阅读 · 0 评论 -
减治法——减可变规模算法
减可变规模算法计算中值和选择问题选择问题(selection problem)是求一个n个数列表的第k个最小元素的问题。这个数字被称为第k个顺序统计量(order statistic)。当然,对于k=l或者k=n的情况,我们可以只扫描所讨论的列表,然后分别找出最小或者最大的元素。该问题的一个更有意思的情况是在k=「n/2]时,它要求找出这样一个元素,该元素比列表中的一半元素大,又比另一半元素小。这个中间的值被称为中值(median),它在数理统计中是一个非常重要的量。显然,为了找出第k个最小的元素,我们原创 2022-03-17 23:02:03 · 880 阅读 · 0 评论 -
减治法——减常因子算法
减常因子算法折半查找对于有序数组的查找来说,折半查找是一种性能卓越的算法。它通过比较查找键K和数组中间元素A[m来完成查找工作。如果它们相等,算法结束。否则,如果K<A[m],就对数组的前半分执行该操作,如果K>A[m],则对数组的后半部分执行该操作。虽然折半查找很明显是基于递归的思想,它也可以很容易地以非递归算法的形式实现。伪代码BinarySearch(A[0..n-1],K) //实现非递归的折半查找 //输入:一个升序数组A[0..n-1]和一个查找键K //输出:一个数组原创 2022-03-17 13:17:31 · 653 阅读 · 0 评论 -
减治法——生成组合对象
生成组合对象组合对象中最重要的类型就是排列、组合和给定集合的子集。一般来说,这种情况出现在要对不同的选择进行考虑的问题中生成排列为了简单起见,假设需要对元素进行排列的集合是从1到n的简单整数集合。为了使它更具有一般性,可以把它们解释为n个元素集合{a1...an}\{a_1...a_n\}{a1...an}中元素的下标。对于生成{1...n}\{1...n\}{1...n}的所有n!个排列的问题,减一技术有什么好建议呢?该问题的规模减一就是要生成所有(n一1)!个排列。假设这个较小的问题已经解决了原创 2022-03-17 02:25:26 · 800 阅读 · 0 评论 -
减治法——拓扑排序
拓扑排序一个常见的例子,我们考虑五门必修课的一个集合{C1.C2.C3,C4,C5},一个在校的学生必须在某个阶段修完这几门课程。可以按照任何次序学习这些课程,只要满足下面这些先决条件:C1和C2没有任何先决条件,修完C1和C2才能修C3,修完C3才能修C4,而修完C3和C4才能修C5。这个学生每个学期只能修一门课程。这个学生应该按照什么顺序来学习这些课程?这种状况可以用一个图来建模,它的节点代表课程,有向边表示先决条件。就这个图来说,上面这个问题其实就是:我们是否可以按照这种次序列出它的顶点,使得原创 2022-03-16 20:52:59 · 843 阅读 · 0 评论 -
减治法——插入排序和希尔排序
插入排序在本节中,我们考虑如何用减一技术对一个数组A[0…n-1]排序。遵循该方法的思路,我们假设对较小数组A[0.n-2]排序的问题已经解决了,得到了一个大小为n-1的有序数组:A[0]≤…≤A[n-2]。我们如何利用这个较小规模的解,并将元素A[n-1]考虑进来,来得到原问题的解呢?显然,我们需要做的就是在这些有序的元素中为A[-1]找到一个合适的位置,然后把它插入到那里。一般来说,我们可以从右到左扫描这个有序的子数组,直到遇到第一个小于等于A[n-1]的元素,然后把A[n-1]插在该元素的原创 2022-03-16 13:20:00 · 636 阅读 · 2 评论 -
深度优先查找和广度优先查找
深度优先查找和广度优先查找在人工智能和运筹学的领域中求解与图有关的许多应用中,这两个算法被证明是非常有用的。并且,如需高效地研究图的基本性质,例如图的连通性以及图是否存在环,这些算法也是必不可少的。深度优先查找深度优先查找可以从任意顶点开始访问图的项点,然后把该顶点标记为已访问。在每次迭代的时候,该算法紧接着处理与当前顶点邻接的未访问顶点。(如果有若干个这样的顶点,可以任意选择一个顶点。但在实际应用中,选择哪一个邻接的未访问候选顶点主要是由表示图的数据结构决定的。在我们的例子中,我们总是根据顶点的原创 2022-03-15 01:52:51 · 727 阅读 · 0 评论 -
穷举查找之旅行商问题、背包问题、分配问题
穷举查找对于组合问题来说,穷举查找是一种简单的蛮力算法。它要求生成问题域中的每一个元素,选出其中满足问题约束的元素,然后再找出一个期望元素。旅行商问题简单来说,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到出发的城市之前,对每个城市都只访问一遍。这个问题可以很方便地用加权图来建模,也就是说,用图的顶点代表城市,用边的权重表示城市间的距离。这样该问题就可以表述为求一个图的最短哈密顿回路问题。哈密顿回路:一个对图的每个顶点都只穿越一次的回路对于四个点都连通的图,我们假定从a点出发,可原创 2022-03-14 21:52:54 · 1446 阅读 · 0 评论 -
最近对和凸包问题的蛮力算法
最近对思路最近点对问题要求在一个包含n个点的集合里,找出距离最近的两个点。最近点对问题的一个最重要的应用的统计学中的聚类分析。对于n个数据点的集合,层次聚类分析希望基于某种相似度度量标准将数据点构成的簇按照层次关系组织起来。对于数值型数据,相似度度量标准通常采用欧几里得距离;对于文本和其他非数值型数据,通常采用诸如汉明距离这样的相似度度量标准。自上而下的算法初始时一般把每个元素作为一个分离的簇,然后合并最临近的簇,使其成为更大的后继簇。目前演示的话,将使用欧几里得距离进行判断标准d(pi.pj)=原创 2022-03-13 02:06:54 · 1132 阅读 · 0 评论 -
顺序查找和蛮力字符串匹配
顺序查找该算法只是简单地将给定数组中的连续元素和给定的查找键进行比较,直到遇到一个匹配的元素(成功查找),或者在遇到匹配元素前就遍历了整个列表(失败查找)。但是怎么才知道自己查找完整个列表了呢?在算法的每次循环时都检查是否到达表的末尾吗?如果我们把需要查找的K,放在A[n]的位置会怎么样?这样子的话,我们必然能够找到K,那就自然不用考虑是否到达列表末尾的问题了。但是我们怎么知道查找到的K是列表中原有的元素还是我们添加了列表末尾的?那自然是,查找结束之后,判断i的值,如果i的值等于n,则表示没找到,小于n则原创 2022-03-12 21:46:55 · 525 阅读 · 0 评论 -
选择排序、冒泡排序
选择排序思路选择排序开始的时候,我们扫描整个列表,找到它的最小元素,然后和第一个元素交换,将最小元素放在它在有序表中的最终位置。然后我们从第二个元素开始扫描列表,找到最后n-1个元素中的最小元素,再和第二个元素交换位置,把第二小的元素放在它的最终位置伪代码:SelectionSort(A[0...n-1]) //该算法用选择排序对给定的数组排序 //输入:一个可排序的数据A[0...n-1] //输出:升序排序的数组A[0...n-1] for i <- 0 to n-2 do m原创 2022-03-12 20:16:07 · 611 阅读 · 0 评论