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

如何做网站优化帮忙建设公司网站

如何做网站优化,帮忙建设公司网站,深圳微信网站开发公司,遵义网站开发公司一、算法概述 斐波那契查找是一种在有序数组中进行查找的算法,它与二分查找类似,但使用斐波那契数列来确定分割点。算法的核心思想是将查找区间按照黄金分割比例(约0.618)进行划分,而不是像二分查找那样均分为二。这种…

一、算法概述

斐波那契查找是一种在有序数组中进行查找的算法,它与二分查找类似,但使用斐波那契数列来确定分割点。算法的核心思想是将查找区间按照黄金分割比例(约0.618)进行划分,而不是像二分查找那样均分为二。这种分割方式在某些场景下可以获得更好的性能。

斐波那契数列基础知识

斐波那契数列定义为:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)

前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...

二、时间复杂度

斐波那契查找的时间复杂度为 O(log n),与二分查找相同。空间复杂度为 O(1),只需存储几个变量。

三、查找思路与公式

1. 基本思路

  1. 找到不小于数组长度n的最小斐波那契数F(k)
  2. 将数组长度扩展到F(k)-1(必要时填充)
  3. 使用F(k-1)-1作为分割点,将数组分为两部分:
    • 前半部分长度为F(k-1)-1
    • 后半部分长度为F(k-2)

2. 分割公式

在斐波那契查找中,分割点的计算公式为:

mid = low + F(k-1) - 1
  • F(k-1) 是斐波那契数列中的一项,k是使得F(k)-1不小于数组长度的最小值。
  • 在斐波那契查找中,F(k-1)对应黄金分割点左边的长度
  • 这个公式反映了黄金分割比例(约为1:0.618)。当数组按照这个比例分割时,大约61.8%的数据会在左边,38.2%的数据会在右边,这就是利用斐波那契数列进行查找的数学基础。

3. 调整斐波那契序列

  • 当目标在右半部分时:k = k-2,因为右半部分长度约为F(k-2)
  • 当目标在左半部分时:k = k-1,因为左半部分长度约为F(k-1)-1

四、代码示例

public class FibonacciSearch {public static int fibonacciSearch(int[] arr, int key) {int n = arr.length;if (n == 0) return -1;// 构造斐波那契数列int fibMMinus2 = 0;   // F(k-2)int fibMMinus1 = 1;   // F(k-1)int fibM = fibMMinus1 + fibMMinus2;  // F(k)// 找到不小于n的最小斐波那契数while (fibM < n) {fibMMinus2 = fibMMinus1;fibMMinus1 = fibM;fibM = fibMMinus1 + fibMMinus2;}// 定义数组的偏移量int offset = -1;// 循环查找while (fibM > 1) {// 计算比较点的索引int i = Math.min(offset + fibMMinus2, n - 1);// 比较并决定向左还是向右if (arr[i] < key) {// 目标在右半部分,调整斐波那契数列fibM = fibMMinus1;fibMMinus1 = fibMMinus2;fibMMinus2 = fibM - fibMMinus1;offset = i;  // 更新偏移量} else if (arr[i] > key) {// 目标在左半部分,调整斐波那契数列fibM = fibMMinus2;fibMMinus1 = fibMMinus1 - fibMMinus2;fibMMinus2 = fibM - fibMMinus1;} else {// 找到目标return i;}}// 检查最后一个元素if (fibMMinus1 == 1 && offset + 1 < n && arr[offset + 1] == key) {return offset + 1;}// 未找到目标return -1;}public static void main(String[] args) {int[] arr = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50};int key = 25;int result = fibonacciSearch(arr, key);if (result != -1) {System.out.println("元素 " + key + " 在数组中的索引位置: " + result);} else {System.out.println("元素 " + key + " 不在数组中");}}
}

五、示例

假设有一个有序数组 [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],查找元素25:

  1. 数组长度为10,找到不小于10的斐波那契数F(7)=13
  2. F(6)=8, F(5)=5
  3. 第一次比较:mid = 0 + F(6) - 1 = 0 + 8 - 1 = 7,arr[7] = 40 > 25
    • 目标在左半部分,调整斐波那契数:F(7)→F(5), F(6)→F(5), F(5)→F(4)
  4. 第二次比较:mid = 0 + F(4) - 1 = 0 + 3 - 1 = 2,arr[2] = 15 < 25
    • 目标在右半部分,调整斐波那契数:F(5)→F(4), F(5)→F(3), F(4)→F(2)
    • 更新offset = 2
  5. 第三次比较:mid = 2 + F(2) - 1 = 2 + 1 - 1 = 2,arr[2] = 15 < 25
    • 目标在右半部分,调整斐波那契数:F(4)→F(3), F(3)→F(2), F(2)→F(1)
    • 更新offset = 2
  6. 第四次比较:mid = 2 + F(1) - 1 = 2 + 1 - 1 = 2,arr[2] = 15 < 25
    • 目标在右半部分,调整斐波那契数:F(3)→F(2), F(2)→F(1), F(1)→F(0)
    • 更新offset = 2
  7. 检查offset+1 = 3,arr[3] = 20 < 25
  8. 检查offset+2 = 4,arr[4] = 25 = 25,找到目标!

六、适用场景和优缺点

适用场景

  • 磁盘等外存查找:减少对前半部分的访问
  • 大型有序数组:在某些数据分布下比二分查找更高效
  • 减少比较次数的场景:按黄金分割比搜索有时能减少平均比较次数

优点

  • 分割更自然:按照黄金分割比例划分区间
  • 在某些场景下效率更高:特别是当数据访问成本不均匀时
  • 只需加减运算:不需要像二分查找那样进行除法操作

缺点

  • 实现较复杂:需要管理斐波那契数列和相关逻辑
  • 需要额外处理:当数组长度不是斐波那契数减1时需要特殊处理
  • 优势不总是明显:在现代计算机中,优势可能不如理论预期

七、总结

斐波那契查找是一种利用黄金分割原理的查找算法,它按照斐波那契数列的特定比例划分查找区间。虽然与二分查找时间复杂度相同,但在某些特定场景下可能更有效率。这种算法展示了如何利用数学性质优化搜索过程,是算法设计思想的一个很好例证。

http://www.dtcms.com/wzjs/579171.html

相关文章:

  • 有那种网站么网站设计与开发公司
  • 建设工程知识类网站安徽网络优化公司
  • 网站没有内容 能做优化吗自己的品牌怎么推广加盟
  • 关于公司建设网站的意义字体
  • 浙江注册公司网站优秀网页设计代码
  • 小型企业类网站开发公司个人商城
  • 网站的交互设计包括哪些网站建设ftp上传是空目录
  • 怎样做企业手机网站首页app和微网站的区别是什么
  • 惠州百优做网站小程序熊掌号网站开发人才储备
  • 网站建设哪些资质龙岗网站建设企业
  • 做博客的网站seo推广培训费用
  • python 快速做网站济南网站建设优化熊掌号
  • 花都做网站公司基于 seajs 的高性能网站开发和优化实践_王保平(淘宝)
  • 徐州企业建站系统平凉网站设计
  • wordpress站标成都网站建设木子网络
  • 网站建设工程师待遇小蝌蚪幸福宝入口导航
  • 天津制作企业网站的ui设计师简历
  • 正规网站开发需要哪些技术企业装修展厅公司
  • 网站开发的形式是discuz开放平台
  • 山西省建设监理协会网站wordpress的运用
  • 免费企业网站管理系统那个网站做外贸
  • 自己做网站要多久wordpress开发移动端
  • 惠州网站建设电话上海网站建设微信开发
  • 网站从哪些方面来做设计类专业需要艺考吗
  • 中国建设电工网站深圳设计公司排深圳市广告公司名
  • 服装商城网站建设价格桂林昨晚发生的新闻
  • 图标网站导航制作怎么做wordpress ip改域名
  • 奥运会网站制作上海著名网站设计公司
  • 用微信小程序怎么做网站网络架构相关文献
  • js做各类图表网站大数据营销策略有哪些