文章目录

    • 凸包问题+最优二叉查找树 都利用javafx生成可视乎界面
  • 凸包问题
    • 1.蛮力算法
    • 2.快速凸包算法
  • 最优二叉查找树
  • 源码

凸包问题+最优二叉查找树 都利用javafx生成可视乎界面

凸包问题

1.蛮力算法

解法:任意选取两个点,然后判断这两个点连接的直线是否为凸边,依次判断所有点。说的通俗一点就是任取两个点,其他的点是否在“这两个点连接的直线”的同一侧。
可以利用for循环依次判断,代码如下。

//判断是否为凸包的边public boolean isValidSide(Point p1, Point p2) {int right = 0;//凸边右边的点int left = 0;//凸边左边的点if (points.length < 3) {//平面点的数量小于3,无法组成凸包return false;}for (int i = 0; i < points.length; i++) {if (points[i].equals(p1) || points[i].equals(p2)) {continue;}if (leftOrRight(p1, p2, points[i]) > 0) {left++;} else if (leftOrRight(p1, p2, points[i]) < 0){right++;}}if (right > 0 && left > 0) {//直线两边都有点时,该边不为凸边return false;}return true;}//判断p3在 p1和p2 所在直线的哪一边public int leftOrRight(Point p1, Point p2, Point p3) {int x1 = p1.x;int y1 = p1.y;int x2 = p2.x;int y2 = p2.y;int x3 = p3.x;int y3 = p3.y;return (y1-y2)*x3+(x2-x1)*y3+x1*y2-y1*x2;}

2.快速凸包算法

解法:首先选取一个最左边和最右边的点,然后再找出离这条直线最远的点,将该点连接那个两个点,同时该点即为凸包边上的点。然后依次根据三角形的边寻找最远的点。最后结果即为凸包。

下面是该解法的核心代码。

 //找凸包边界的点public void findPoint() {if (points.length < 3) {return;}Point left = points[0], right = points[0], maxfarP = points[0];//最左边和最右边的点,离这两点直线最远的点for (int i = 0; i < points.length; i++) {if (points[i].x < left.x) {left = points[i];} else if (points[i].x > right.x) {right = points[i];}}int far = 0;for (int i = 0; i < points.length; i++) {if (Math.abs(distance(left, right, points[i])) > far) {far = Math.abs(distance(left, right, points[i]));maxfarP = points[i];}}list.add(left);list.add(right);list.add(maxfarP);findEndPoint(outPoint(left, right, maxfarP, points), left, right);findEndPoint(outPoint(maxfarP, right, left, points), maxfarP, right);findEndPoint(outPoint(left, maxfarP, right, points), left, maxfarP);}public void findEndPoint(Point[] points, Point p1, Point p2) {if (points.length == 0) {//凸边无其他点return;}//寻找离直线最远的点Point maxfarP = points[0];int far = 0;for (int i = 0; i < points.length; i++) {if (far < Math.abs(distance(p1, p2, points[i]))) {maxfarP = points[i];far = Math.abs(distance(p1, p2, points[i]));}}list.add(maxfarP);//形成新的三角形凸包后,继续重复步骤。//判断两条边是否为凸边,若不是继续执行findEndPoint(outPoint(p1, maxfarP, p2, points), p1, maxfarP);findEndPoint(outPoint(p2, maxfarP, p1, points), p2, maxfarP);}

以下是凸包问题的截图

最优二叉查找树

题目:产生 20 个随机小数,其和为 1,分别表示 20 个结点的查找概率,构造一颗最优二叉查找树。
解法:根据动态规划求出平均查找时间,同时确定相应的顶点。
伪代码:
算法 OptimalBST(P[1…n])
//动态规划算法求最优二叉树
//输入:一个n个键的有序列表的查找概率数组P[1…n]
//输出:在最优BST中成功查找的平均比较次数,以及最优BST中树的根表R

for i ← 1 to n doC[i,i-1] ← 0C[i,j] ← P[i]R[i,j] ← i
C[n+1,n] ← 0
for d←1 to n-1 do //对角线计数for i←1 to n-1 doj ← i+d
minval ← ∞
for k ← i to j doif C[i,k-1]+C[k+1,j]<minvalminval ← C[i,k-1]+C[k+1,j];kmin ← k
R[i,j] ← kmin
sum ← P[i];
for s ← i+1 to j dosum ← sum + P[s]
C[i,j] ← minval +sumreturn C[1,n],R

实现核心代码如下

/*** 生成主表和根表*/public void OptimalBST(){c = new double[p.length + 1][p.length];r = new int[p.length + 1][p.length];int n = p.length-1;for (int i = 1; i <= n; i++) {c[i][i-1] = 0;c[i][i] = p[i];r[i][i] = i;}c[n+1][n] = 0;for (int d = 1; d <= n-1; d++) {for (int i = 1; i <= n-d; i++) {int j = i+d;double minval = Double.MAX_VALUE;int kmin = 0;for (int k = i; k <= j; k++) {if (c[i][k - 1] + c[k + 1][j] < minval) {minval = c[i][k-1] + c[k+1][j];kmin = k;}}r[i][j] = kmin;double sum = p[i];for (int s = i+1; s <= j; s++) {sum = sum + p[s];}c[i][j] = minval + sum;}}}//根据根表生成最优二叉查找树public void getOBST(int x, int y, int val, Node node){int leftLoc = r[x][val - 1];if (leftLoc != 0) {double lNum = p[leftLoc];Node lnode = new Node(lNum);node.setlNode(lnode);getOBST(x, val-1, leftLoc, lnode);}int rightLoc = r[val+1][y];if (rightLoc != 0) {double rNum = p[rightLoc];Node rnode = new Node(rNum);node.setrNode(rnode);getOBST(val + 1, y, rightLoc, rnode);}}

实现截图


若想修改生成节点数可在代码中修改。

各位小伙伴有什么问题评论区留言o((>ω< ))o

源码

具体源码地址:https://download.csdn.net/download/qq_49143427/85524497

凸包问题(包含蛮力算法和快速凸包算法)+最优二叉查找树详解相关推荐

  1. 算法笔记(3)—— 快速 I/O 算法:快速输入算法、快速输出算法

    I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出,在算法竞赛里面一般指的就是控制台(那个黑窗口)里面的输入与输出,平时我们或许并 ...

  2. 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  3. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. Unity快速入门之二 GUI Transform 详解

    Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速入门之二 GUI Transform 详解_翕翕堂 Unity快速入门之三 ...

  5. python 查找算法_python快速查找算法应用实例

    文实例讲述了Python快速查找算法的应用,分享给大家供大家参考. 具体实现方法如下: import random def partition(list_object,start,end): rand ...

  6. RSA密码的手动算法+快速幂算法

    公钥加密方案(非对称加密算法) 1.为什么要引入公钥加密方案? 密码学中的加密方案分成对称密钥和非对称密钥(也就是我们说的公钥加密,代表加密算法是RSA加密算法). 而对称加密方法有一个特点,任何通信 ...

  7. vue3 - diff算法之快速diff算法

    快速Diff算法 预处理 前面讲到简单Diff算法和双端Diff算法,它们使用不一样的对比规则对虚拟节点的 type(元素名)和 虚拟节点的key(唯一标识)来区分是否有可以复用的旧节点.快速Diff ...

  8. leetcode算法总结 —— 快速幂算法

    文章目录 1. 引出快速幂算法 2. 简化语句 3. 使用位运算来提升性能 4. 对应leetcode题型 参考的是大神的文章,这篇文章相当好 https://blog.csdn.net/qq_197 ...

  9. 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战

    关键词提取和文本摘要算法TextRank详解及实战 写在前面 最近一直没有更新文章,实在惭愧.伴随着小老弟的职业方向由风控转向了NLP,后面的文章也会集中在NLP领域,希望大家能够继续支持~ 导读 本 ...

  10. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

最新文章

  1. 用nodejs搭建最简单、轻量化的http server
  2. 解决w: pt/sources.list:18 中被配置了多次
  3. tail -f 不断刷新
  4. MySQL engine/type类型InnoDB/MYISAM/MERGE/BDB/HEAP的区别
  5. ai人工智能的数据服务_从AI数据集中消除无意识的偏见
  6. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器
  7. Ubuntu U盘终于见到了它的主人
  8. 弹性力学方程 有限差分法matlab,泊松方程的有限差分法的MATLAB实现
  9. 【对话系统】对话系统核心技术概要
  10. 【五万字深度洞察】毒舌阿朱最看好的企业服务商
  11. 计算机中的文件及文件命名规则,文件名的命名规则是什么
  12. 外贸常用术语_常用外贸术语大全,外贸人的必备
  13. 第三章 词汇与分词技术
  14. html 纯白色,要一张全屏的空白的图(纯白色的)
  15. pdf怎么插入页码步骤介绍
  16. 硬盘坏了,如何检测与修复。
  17. 使用Java在浏览器页面无法导出excel表格
  18. HZNU1883CCJ的直线化简
  19. useEffect五个经典问题实践总结
  20. 硬件电路(3)设计篇----为什么栅极型推挽电路不用上P下N?

热门文章

  1. layui 之button 事件绑定的一种方法
  2. 0框架前端-如何写一个按钮(button)
  3. HTML + CSS + JS知识点复习(第一次)
  4. jackson框架java反序列化漏洞_Jackson CVE-2019-12384: 反序列化漏洞复现
  5. 详细图解MySQL(win7x64 5.7.16版本)下载、安装、配置与使用
  6. linux下fish配置终端,如何在Linux中安装、配置和使用Fish Shell?
  7. potplayer最全使用教程,【无边框透明美化教程】+【全球IPTV电视直播教程】+【不用下载观看影视剧教程】!
  8. springboot整合富文本编辑器
  9. SCPPO(十二):SQL误操作如何恢复?
  10. JVC DSP调音软件