关于算法--蛮力法--最近对和凸包问题

一、最近对问题:即从一个二维或多位的空间中找出距离最近的两个点

1、步骤

  a、分别计算每一对点之间的距离

  b、找出距离最近的那一对

  (为了避免重复计算,只考虑i<j的那些对)

2、JavaScript实现

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>最近对问题</title>
 6 </head>
 7 <body>
 8
 9 </body>
10 <script type="text/javascript">
11     var point = function(x, y) {
12         var _arr = new Array();
13         _arr = [x, y];
14         _arr.x = x;
15         _arr.y = y;
16         return _arr;
17     }
18
19     var caculate = function(p1, p2) {
20         return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
21     }
22
23     function search(arr) {
24         var dis = Number.POSITIVE_INFINITY;
25         var indexX = null;
26         var indexY = null;
27         for(var i = 0; i < arr.length - 1; i++){
28             for(var j = i+1; j < arr.length; j++){
29                 var d = caculate(arr[i], arr[j]);
30                 if(d < dis){
31                     dis = d;
32                     indexX = i;
33                     indexY = j;
34                 }
35             }
36         }
37         return "第 "+indexX+" 个点和第 "+indexY+" 个点之间的距离最近";
38     }
39
40     //实验阶段
41     //创建四个点坐标分别为(0,0),(2,0),(0,3),(2,1)
42     var p1 = new point(0,0);
43     var p2 = new point(2,0);
44     var p3 = new point(0,3);
45     var p4 = new point(2,1);
46     console.log(search([p1, p2, p3, p4]))
47 </script>
48 </html>

3、算法分析

可使用(Xi - Xj)2 +(Yi - Yj)2代替sqrt((Xi - Xj)2 +(Yi - Yj)2),尽量避免开方;所以本算法的基本操作是求平方,执行次数C(n) = Σ[i=1 to n-1]Σ[j=i+1 to n] 2 = n(n - 1),属于Θ(n2)



一、凸包问题

1、凸集合概念:对于平面上一个点集合,如果以集合中任意两点P和Q未断电的线段,均属于该集合,则集合是凸的

2、凸包:凸包是包含所有点的最小凸集合

3、一般判断方法:判断是否所有其他点都在连接P1和P2的直线同一侧

4、一般时间效率:它属于Θ(n3);对于不同的点的每一个n(n-1)/2,都要比较其它n-2个点的符号

时间: 2024-10-24 15:15:29

关于算法--蛮力法--最近对和凸包问题的相关文章

算法——蛮力法之最近对问题和凸包问题

上次的博客写到一半宿舍停电了....然而今天想起来补充完的时候发现博客园并没有自动保存哦,微笑. 首先来看最近对问题,最近对问题描述的就是在包含n个端的集合中找到距离最近的两个点,当然问题也可以定义在多维空间中,但是这里只是跟随书上的思路实现了二维情况下的最近对问题.假设所有讨论的点是以标准的笛卡尔坐标形式(x,y)给出的,那么在两个点Pi=(Xi,Yi)和Pj=(Xj,Yj)之间的距离是标准的欧几里得距离: d(Pi,Pj)=sqrt( (X1-X2)2+(Y1-Y2)2 ) 蛮力法的思路就是

蛮力法-最近对和凸包问题

3.3.1 最近对问题 问题描述:要求找出一个包含n个点的集合中距离最近的两个点.原本思想是我们应该去比较两点之间的欧几里得距离,而实际上,我们可以去比较它们的平方,这样,我们就可以避免对平方根的近似求解. 代码实现: /** * 蛮力法解决最近对问题 * @author xiaofeig * @since 2015.9.16 * @param points 对象点集 * @return 返回包含最小对的下标 * */ public static int[] bruteForceClosestP

关于算法--蛮力法篇--选择排序

近日开始学习算法,所看课本为清华大学出版社的<算法设计与分析基础>,对简单的数据结构进行了复习,已经学习了算法效率分析基础. 本篇开始对所学算法的思想进行实际JS编码,看学习的进度,每日写一篇学到的算法,以上为背景. 蛮力法是一种直接解决问题的方法,常常基于问题的描述和所涉及的概念定义:所谓的“力”,指的是计算机的计算能力. 优点是①可解决广阔的领域各种问题:②可以产生一些合理的算法:③实例不多时,可用一种能接受的速度求解:④可解决一些小规模问题实例:⑤可作为研究或教学目的,作为其他算法的准绳

算法——蛮力法之选择排序和冒泡排序c++实现

这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出最小的一个元素一次放在前面的位置:而冒泡排序法每次是将相邻两个元素进行比较,将较大的元素放在后面,这样一次扫描结束后就将当前最大的那个元素放在了列表的后面. 两个排序方法的算法如下: 选择排序法 SelectionSort(A[0....n-1]) //输入:一个可排序数组A[0....n-1],

关于算法--蛮力法--字符与字符串匹配

一.顺序查找 1.步骤:简单的将给定列表中的连续元素与给定的查找键作比较,直到遇到一个匹配的元素或遇到匹配元素前就遍历了整个列表 2.JavaScript代码实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>SelectionFind</title> 6 </head>

算法——蛮力法之顺序查找和蛮力字符串匹配

接着昨天的选择排序和冒泡排序之后,今天来实现一下顺序查找和蛮力字符串匹配两个算法. 顺序查找就是将给定的查找键和列表周玲的每个元素进行比较,直到找到一个匹配成功的元素返回该元素下标,查找成功,或者查找整个列表二没有匹配元素,查找失败.这里记录一下限位器版顺序查找方法.限位器就是指将查找键添加到列表最后,这样在查找的过程中,不用再每次都判断是否到达列表尾部来判断查找是否失败,而是在查找结束后,判断匹配元素下标是否小于n(假设列表有n个元素)来判断查找是否成功.下面是限位器版顺序查找算法: 限位器版

关于算法--蛮力法--冒泡排序

冒泡排序 一.步骤 ①比较列表中的相邻元素,如果它们是逆序的则交换位置,进行下一组,多次比较之后,最大的元素就“沉入”到了列表的最后 ②比较下一轮,直到n-1遍之后,列表顺序完毕 二.JavaScript代码实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>BubbleSort</tit

python动态演示蛮力法解决凸包问题

最近开了算法课,但是我的算法着实不咋地,一直搞web和逆向,就没怎么编程.记录一下0.0 算法倒是不难实现,但是这个动态演示很烦,从纯粹的可视化小白,强行写完了,写完发现非常简单,只是自己不知道的函数太多了,哭了.... 蛮力法就不用解释了,通俗的说就是把所有可能试一遍. 凸包问题,就是将n个点中某几个点围成一个多边形,除了这n个点,其余的点都在这个多边形内. 核心算法其实就是一个行列式演变而来,后悔没学好线代..... 参考:https://blog.csdn.net/u011001084/a

(算法初步学习)蛮力法解决生成子集问题

关于蛮力法求生成子集问题 对于算法分析中的问题我已经不想对自己说什么了,到了大三了,竟然还是小白.对生成子集问题我研究了一下午,最后终于想通了.思路:   1.利用<math.h> 头文件中的pow(x,y)函数来求得2的n次方,作为外循环.2.然后写一个将10进制数转换为2进制数的函数(当然,C中有专门的转换进制的函数在<stdlib.h>中,但是,他转换下来  5不是0101而是101,这就导致需要分开判断,所以不用itoa函数).如下:conversation(int n,i