当前位置: 首页 > news >正文

重庆网站怎么做出来的凡科快图app怎么下载

重庆网站怎么做出来的,凡科快图app怎么下载,网站建设需要用什么书,安徽省建设干部网站文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中#xff0c;我们… 文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中我们常用的查找有四种:     ① 顺序(线性)查找     ② 二分查找/折半查找     ③ 插值查找     ④ 斐波那契查找 1. 线性查找算法 问题     数组arr[] {1, 9, 11, -1, 34, 89}使用线性查找方式找出11所在的位置。 代码实现 package search;public class SeqSearch {public static void main(String[] args) {int arr[] { 1, 9, 11, -1, 34, 89 };// 没有顺序的数组int index seqSearch(arr, 11);if (index -1) {System.out.println(没有找到);} else {System.out.println(找到了下标为 index);}}/*** 这里实现的线性查找是找到一个满足条件的值就返回* * param arr* param value* return*/public static int seqSearch(int[] arr, int value) {// 线性查找是逐一比对发现有相同的值就返回下标for (int i 0; i arr.length; i) {if (arr[i] value) {return i;}}return -1;}}运行结果 2. 二分查找算法 问题     请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} 输入一个数看看该数组是否存在此数并且求出下标如果没有就提示没有这个数。 2.1. 思路分析 二分查找的思路分析 首先确定该数组的中间的下标 m i d ( l e f t r i g h t ) / 2 mid (left right) / 2 mid(leftright)/2 然后让需要查找的数 findVal 和 arr[mid] 比较 2.1. findVal arr[mid]说明你要查找的数在mid 的右边, 因此需要递归的向右查找 2.2. findVal arr[mid]说明你要查找的数在mid 的左边, 因此需要递归的向左查找 2.3. findVal arr[mid]说明找到就返回 什么时候需要结束递归 ①找到就结束递归 ②递归完整个数组仍然没有找到findVal也需要结束递归 当 left right 就需要退出 2.2. 代码实现 注意使用二分查找的前提是 该数组是有序的 package search;public class BinarySearch {public static void main(String[] args) {int arr[] { 1, 8, 10, 89, 1000, 1234 };int resIndex binarySearch(arr, 0, arr.length - 1, 1);System.out.println(resIndex resIndex);}// 二分查找法/*** * param arr 数组* param left 左边的索引* param right 右边的索引* param findVal 要查找的值* return 如果找到就返回下标如果没有找到就返回-1*/public static int binarySearch(int[] arr, int left, int right, int findVal) {// 当left right 时说明递归整个数组但是没有找到if (left right) {return -1;}int mid (left right) / 2;int midVal arr[mid];if (findVal midVal) {// 向右递归return binarySearch(arr, mid 1, right, findVal);} else if (findVal midVal) {return binarySearch(arr, left, mid - 1, findVal);} else {return mid;}}}运行结果 2.3. 功能拓展 问题     数组{1,8, 10, 89, 1000, 10001234} 当一个有序数组中有多个相同的数值时如何将所有的数值都查找到比如这里的 1000。 代码实现 package search;import java.util.ArrayList; import java.util.List;public class BinarySearch {public static void main(String[] args) {int arr[] { 1, 8, 10, 89, 1000, 1000, 1234 };ListInteger resIndexList binarySearch2(arr, 0, arr.length - 1, 1000);System.out.println(resIndexList resIndexList);}/** 思路分析* 1. 在找 mid 的索引值不要马上返回* 2. 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayList* 3. 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayList* 4. 将 ArrayList 返回*/public static ListInteger binarySearch2(int[] arr, int left, int right, int findVal) {// 当left right 时说明递归整个数组但是没有找到if (left right) {return new ArrayListInteger();}int mid (left right) / 2;int midVal arr[mid];if (findVal midVal) {// 向右递归return binarySearch2(arr, mid 1, right, findVal);} else if (findVal midVal) {return binarySearch2(arr, left, mid - 1, findVal);} else {/** 思路分析* 1. 在找 mid 的索引值不要马上返回* 2. 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayList* 3. 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayList* 4. 将 ArrayList 返回*/ListInteger resIndexlist new ArrayListInteger();// 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayListint temp mid - 1;while (true) {if (temp 0 || arr[temp] ! findVal) {// 退出break;}// 否则就将temp放入到resIndexlistresIndexlist.add(temp);temp - 1;// temp左移}resIndexlist.add(mid);// 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayListtemp mid 1;while (true) {if (temp arr.length - 1 || arr[temp] ! findVal) {// 退出break;}// 否则就将temp放入到resIndexlistresIndexlist.add(temp);temp 1;// temp左移}return resIndexlist;}}}运行结果 3. 插值查找算法 3.1. 前言 二分查找算法存在查找效率较慢的情况因为其中的mid是从中间开始取的。假如对数组{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }进行查找查找 1 所在的位置实现代码如下 package search;import java.util.ArrayList; import java.util.List;public class BinarySearch {public static void main(String[] args) {int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };ListInteger resIndexList binarySearch2(arr, 0, arr.length - 1, 1);System.out.println(resIndexList resIndexList);}/** 思路分析* 1. 在找 mid 的索引值不要马上返回* 2. 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayList* 3. 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayList* 4. 将 ArrayList 返回*/public static ListInteger binarySearch2(int[] arr, int left, int right, int findVal) {System.out.println(调用了一次);// 当left right 时说明递归整个数组但是没有找到if (left right) {return new ArrayListInteger();}int mid (left right) / 2;int midVal arr[mid];if (findVal midVal) {// 向右递归return binarySearch2(arr, mid 1, right, findVal);} else if (findVal midVal) {return binarySearch2(arr, left, mid - 1, findVal);} else {/** 思路分析* 1. 在找 mid 的索引值不要马上返回* 2. 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayList* 3. 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayList* 4. 将 ArrayList 返回*/ListInteger resIndexlist new ArrayListInteger();// 向 mid 索引值的左边扫描将所有满足1000的元素的下标加入到集合ArrayListint temp mid - 1;while (true) {if (temp 0 || arr[temp] ! findVal) {// 退出break;}// 否则就将temp放入到resIndexlistresIndexlist.add(temp);temp - 1;// temp左移}resIndexlist.add(mid);// 向 mid 索引值的右边扫描将所有满足1000的元素的下标加入到集合ArrayListtemp mid 1;while (true) {if (temp arr.length - 1 || arr[temp] ! findVal) {// 退出break;}// 否则就将temp放入到resIndexlistresIndexlist.add(temp);temp 1;// temp左移}return resIndexlist;}}}运行结果 总共调用了4次才查找出1的索引值效率较慢。通过插值查找可改善上述问题。 3.2. 相关概念 原理介绍     插值查找算法类似于二分查找不同的是插值查找每次从自适应 mid 处开始查找。 mid的计算公式     对二分查找中的求 mid 索引的公式进行修改 上图公式中 ① low 表示左边索引 left ② high 表示右边索引 right ③ key 就是前面二分查找中讲的 findVal(要查找的值) 即插值查找的 mid计算公式 m i d l o w ( h i g h − l o w ) k e y − a r r [ l o w ] a r r [ h i g h ] − a r r [ l o w ] \begin{aligned} mid low (high-low)\frac{key-arr[low]}{arr[high]-arr[low]} \end{aligned} ​midlow(high−low)arr[high]−arr[low]key−arr[low]​​ 对应前面的代码公式即 m i d l e f t ( r i g h t – l e f t ) f i n d V a l – a r r [ l e f t ] a r r [ r i g h t ] – a r r [ l e f t ] \begin{aligned} mid left (right – left)\frac{findVal – arr[left]}{arr[right] – arr[left]} \end{aligned} ​midleft(right–left)arr[right]–arr[left]findVal–arr[left]​​ 举例说明          数组 arr [1, 2, 3, …, 100]      ①假如需要查找的值是 1     (使用二分查找的话需要多次递归才能找到 1 的下标0)     使用插值查找算法 m i d l e f t ( r i g h t – l e f t ) f i n d V a l – a r r [ l e f t ] a r r [ r i g h t ] – a r r [ l e f t ] \begin{aligned}mid left (right – left)\frac{findVal – arr[left]}{arr[right] – arr[left]}\end{aligned} ​midleft(right–left)arr[right]–arr[left]findVal–arr[left]​​ 即 m i d 0 ( 99 − 0 ) 1 − 1 100 − 1 0 99 ∗ 0 99 0 ( 直接定位到下标 0 ) \begin{aligned}mid 0(99-0)\frac{1-1}{100-1} 0 99 * \frac{0}{99} 0\ \ \ (直接定位到下标0)\end{aligned} ​mid0(99−0)100−11−1​099∗990​0   (直接定位到下标0)​ ②假如需要查找的值是 100 m i d 0 ( 99 − 0 ) 100 − 1 ( 100 − 1 0 99 ∗ 99 99 0 99 99 ( 直接定位到下标 99 ) \begin{aligned}mid 0 (99 - 0)\frac{100 - 1}{(100 - 1} 0 99 * \frac{99}{99} 0 99 99\ \ \ (直接定位到下标99)\end{aligned} ​mid0(99−0)(100−1100−1​099∗9999​09999   (直接定位到下标99)​ 3.3. 实例应用 问题     对数组 arr [1, 2, 3, …, 100] 使用插值查找算法找到 1 的索引值(下标) 代码实现 package search;import java.util.Arrays;public class InsertValueSearch {public static void main(String[] args) {int[] arr new int[100];for (int i 0; i 100; i) {arr[i] i 1;}int index insertValueSearch(arr, 0, arr.length - 1, 1);System.out.println(index index);// System.out.println(Arrays.toString(arr));}// 编写插值查找算法// 说明插值查找算法也要求数组是有序的/*** * param arr 数组* param left 左边索引* param right 右边索引* param findVal 要查找的值* return 如果找到就返回对应的下标如果没有找到就返回-1*/public static int insertValueSearch(int[] arr, int left, int right, int findVal) {System.out.println(查找了一次);// 注意findVal arr[0] 和 findVal arr[arr.length - 1] 必须需要否则得到的mid可能越界if (left right || findVal arr[0] || findVal arr[arr.length - 1]) {return -1;}// 求出 midint mid left (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);int midVal arr[mid];if (findVal midVal) {// 说明应该向右边递归return insertValueSearch(arr, mid 1, right, findVal);} else if (findVal midVal) {// 说明应该向左递归return insertValueSearch(arr, left, mid - 1, findVal);} else {return mid;}}}运行结果 注意事项 对于数据量较大关键字分布比较均匀的查找表来说采用插值查找, 速度较快.关键字分布不均匀的情况下该方法不一定比折半(二分)查找要好 4. 斐波那契(黄金分割法)查找算法 黄金分割点是指把一条线段分割为两部分使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是 0.618。由于按此比例设计的造型十分美丽因此称为黄金分割也称为中外比。这是一个神奇的数字会带来意想不到的效果。 斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … … } 发现斐波那契数列的两个相邻数 的比例无限接近 黄金分割值0.618。 4.1. 斐波那契(黄金分割法)原理 斐波那契查找原理与前两种相似仅仅改变了中间结点mid的位置mid 不再是中间或插值得到而是位于黄金分割点附近即 m i d l o w F [ k − 1 ] − 1 midlowF[k-1]-1 midlowF[k−1]−1 F F F 代表斐波那契数列如下图所示 对 F(k-1)-1 的理解 由斐波那契数列 F [ k ] F [ k − 1 ] F [ k − 2 ] F[k]F[k-1]F[k-2] F[k]F[k−1]F[k−2] 的性质可以得到 ( F [ k ] − 1 ) ( F [ k − 1 ] − 1 ) ( F [ k − 2 ] − 1 ) 1 (F[k]-1)(F[k-1]-1)(F[k-2]-1)1 (F[k]−1)(F[k−1]−1)(F[k−2]−1)1 。该式说明只要顺序表的长度为 F[k]-1则可以将该表分成长度为 F [ k − 1 ] − 1 F[k-1]-1 F[k−1]−1 和 F [ k − 2 ] − 1 F[k-2]-1 F[k−2]−1 的两段即如上图所示。从而中间位置为 m i d l o w F [ k − 1 ] − 1 midlowF[k-1]-1 midlowF[k−1]−1类似的每一子段也可以用相同的方式分割但顺序表长度 n n n 不一定刚好等于 F [ k ] − 1 F[k]-1 F[k]−1所以需要将原来的顺序表长度 n n n 增加至 F [ k ] − 1 F[k]-1 F[k]−1。这里的 k k k 值只要能使得 F [ k ] − 1 F[k]-1 F[k]−1 恰好大于或等于 n n n 即可由以下代码得到顺序表长度增加后新增的位置从 n 1 n1 n1 到 F [ k ] − 1 F[k]-1 F[k]−1 位置都赋为 n n n 位置的值即可。 while(nfib(k)-1)   k; 4.2. 实例应用 问题     请对一个有序数组进行斐波那契查找 {1,8, 10, 89, 1000, 1234} 输入一个数看看该数组是否存在此数并且求出下标如果没有就提示没有这个数(return -1)。 代码实现 package search;import java.util.Arrays;public class FibonacciSearch {public static int maxSize 20;public static void main(String[] args) {int[] arr { 1, 8, 10, 89, 1000, 1234 };System.out.println(index fibSearch(arr, 89));}// 因为后面我们midlowF(k-1)-1,需要使用斐波那契数列因此我们需要先获取到一个斐波那契数列// 非递归方法得到一个斐波那契数列public static int[] fib() {int[] f new int[maxSize];f[0] 1;f[1] 1;for (int i 2; i maxSize; i) {f[i] f[i - 1] f[i - 2];}return f;}// 编写斐波那契查找算法// 使用非递归的方式编写算法/*** * param a 数组* param key 需要查找的关键字(值)* return 返回对应的下标如果没有就返回-1*/public static int fibSearch(int[] a, int key) {int low 0;int high a.length - 1;int k 0;// 表示斐波那契分割数值的下标int mid 0;// 存放mid值int f[] fib();// 获取到斐波那契数列// 获取到斐波那契分割数值的下标while (high f[k] - 1) {k;}// 因为f[k]的值 可能大于a的长度因此需要使用Arrays类构造一个新的数组并指向a[]// 不足的部分会使用0填充int[] temp Arrays.copyOf(a, f[k]);// 实际上需要使用a数组的最后的数填充temp// 举例// temp {1,8,10,89,1000,1234,0,0,0} -- {1,8,10,89,1000,1234,1234,1234,1234}for (int i high 1; i temp.length; i) {temp[i] a[high];}// 使用while循环处理找到keywhile (low high) {// 只要这个条件满足就可以找mid low f[k - 1] - 1;if (key temp[mid]) {// 继续向数组的前面查找左边high mid - 1;// 为什么是k--// 说明// 1. 全部元素前面的元素后面的元素// 2. f[k] f[k-1] f[k-2]// 因为 前面有f[k-1]个元素所以可以继续拆分 f[k-1] f[k-2] f[k-3]// 即 在f[k-1]的前面继续查找(k--)// 即 下次循环的 mid f[k-1-1]-1k--;} else if (key temp[mid]) {// 继续向数组的后面查找右边low mid 1;// 为什么是 k - 2// 说明// 1. 全部元素前面的元素后面的元素// 2. f[k] f[k-1] f[k-2]// 因为 后面有f[k-2]个元素所以可以继续拆分 f[k-2] f[k-3] f[k-4]// 即 在f[k-2]的后面继续查找(k-2)// 即 下次循环的 mid f[k-1-2]-1k - 2;} else {// 找到// 需要确定返回的是哪一个下标if (mid high) {return mid;} else {return high;}}}return -1;}}运行结果
http://www.pierceye.com/news/415962/

相关文章:

  • 怎么样做钓鱼网站怎么建网站app
  • 高校财务网站建设国外网站ip地址
  • 重要的龙岗网站建设影视公司网站模板
  • 品牌网站 响应式网站wordpress oss静态
  • 免费网站制作中小型企业查询网址
  • 企业网站的seo广州市企业网站建设平台
  • 备案网站名称与实际网站名称不一致企业门户网站平台建设招标采购文件
  • 张掖网站制作wordpress 主题安装教程
  • 企业网站建设合作合同网页做成app
  • 郑州建网站价格医院网页
  • 南京设计网站网站速度的重要性
  • 河南智能网站建设平台简易网站建设
  • 成都鱼羊环保网站制作设计网站 关键字 标签
  • 邓修明调研成都网站建设鞍山建一个网站大概要多少钱
  • 聊城网站开发公司专业开发小程序公司
  • 三门峡网站建设推广用个人电脑做服务器建网站
  • 黄冈论坛交友网站首页seo怎么做
  • 网站注册域名 免费网站建设进度及实施过程
  • 如何购买一个网站的域名小程序开发公司网
  • 产品包装设计素材网站均安建网站
  • 甘肃建设网站找别人做网站需要注意什么
  • php做电子商城网站创业找项目
  • 网站建设建设公司有哪些帝国手机网站cms系统
  • 网站设计包括什么软件房产交易网上预约平台
  • 企业做网站有什么好处坏处四川住房城乡和城乡建设厅网站首页
  • 小学学校网站建设计划广州seo顾问服务
  • 做淘宝素材网站哪个好用网站制作网站建设需要多少钱
  • 住房建设部官方网站设计费计取wordpress仿百度搜索主题
  • 云建站平台哪家好沈阳百度seo关键词排名优化软件
  • 响应式网站设计的优点国内优秀设计网站