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

企业名称预先核准网上申请系统商品标题关键词优化

企业名称预先核准网上申请系统,商品标题关键词优化,购买域名后怎么做网站,武汉建站公司排名### 什么是Fibonacci查找 Fibonacci查找是一种搜索算法,它结合了Fibonacci数列和二分查找的思想,用于在有序数组中查找目标值。它的主要优点是在某些情况下可以比普通二分查找更高效。 ### Fibonacci数列 Fibonacci数列是一个递归定义的数列&#xff0…

### 什么是Fibonacci查找

Fibonacci查找是一种搜索算法,它结合了Fibonacci数列和二分查找的思想,用于在有序数组中查找目标值。它的主要优点是在某些情况下可以比普通二分查找更高效。

### Fibonacci数列
Fibonacci数列是一个递归定义的数列,通常表示为:
\[ F(n) = F(n-1) + F(n-2) \]
其中,\( F(0) = 0 \) 和 \( F(1) = 1 \)。

前几个Fibonacci数是:
\[ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, \ldots \]

### Fibonacci查找步骤
以下是Fibonacci查找的详细步骤:

1. **准备阶段**:
   - 计算出一个足够大的Fibonacci数,使得该数大于或等于数组的长度。这可以通过迭代方法实现。
   
2. **初始化指针**:
   - 初始化三个指针:\( fibMm2 \)(表示\( F(m-2) \)),\( fibMm1 \)(表示\( F(m-1) \)),以及\( fibM \)(表示\( F(m) \))。初始值是\( fibMm2 = 0 \),\( fibMm1 = 1 \),\( fibM = fibMm2 + fibMm1 \)。

3. **搜索阶段**:
   - 通过不断调整指针来缩小搜索范围,直到找到目标值或确认目标值不存在。
   - 具体过程如下:
     - 计算“检查点”位置:\( offset + fibMm2 \)。
     - 比较该位置的值与目标值:
       - 如果相等,则找到目标值。
       - 如果目标值小于该位置的值,则调整指针以缩小搜索范围至左侧部分。
       - 如果目标值大于该位置的值,则调整指针以缩小搜索范围至右侧部分。

4. **结束条件**:
   - 确定目标值是否存在于数组中。
   - 如果搜索范围缩小到单个元素,直接比较该元素与目标值。

### 示例
让我们通过一个示例来更好地理解Fibonacci查找:

假设我们有一个有序数组\[10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100\],我们要查找目标值85。

1. **准备阶段**:
   - 数组长度为11,找到的最小Fibonacci数大于或等于11的是13(即F7 = 13)。
   
2. **初始化指针**:
   - \( fibMm2 = 5 \)(F5 = 5)
   - \( fibMm1 = 8 \)(F6 = 8)
   - \( fibM = 13 \)(F7 = 13)

3. **搜索阶段**:
   - 初始检查点位置:\( offset + fibMm2 = -1 + 5 = 4 \)。
     - 数组中第4个位置的值是45,小于85,因此我们缩小搜索范围至右侧部分。
   - 更新指针:
     - \( fibM = fibMm1 = 8 \)
     - \( fibMm1 = fibMm2 = 5 \)
     - \( fibMm2 = fibM - fibMm1 = 3 \)
   - 新的检查点位置:\( offset + fibMm2 = 4 + 3 = 7 \)。
     - 数组中第7个位置的值是82,小于85,因此我们继续缩小搜索范围至右侧部分。
   - 更新指针:
     - \( fibM = fibMm1 = 5 \)
     - \( fibMm1 = fibMm2 = 3 \)
     - \( fibMm2 = fibM - fibMm1 = 2 \)
   - 新的检查点位置:\( offset + fibMm2 = 7 + 2 = 9 \)。
     - 数组中第9个位置的值是85,正好等于目标值,因此查找成功。

### 总结
Fibonacci查找通过利用Fibonacci数列中的数来确定分割点,从而有效地缩小搜索范围。在某些情况下,它比传统的二分查找更具优势。它的实现和理解需要一些数学基础和对Fibonacci数列的熟悉。

下面是Fibonacci查找的Python代码实现以及逐行解释:

```python
# 导入所需的模块
def fibonacci_search(arr, x):
    """
    在有序数组arr中查找目标值x,如果找到则返回其索引,否则返回-1
    """
    # 初始化Fibonacci数
    fibMm2 = 0  # (m-2)'th Fibonacci number
    fibMm1 = 1  # (m-1)'th Fibonacci number
    fibM = fibMm1 + fibMm2  # m'th Fibonacci number

    # 找到一个大于或等于数组长度的Fibonacci数
    n = len(arr)
    while fibM < n:
        fibMm2 = fibMm1
        fibMm1 = fibM
        fibM = fibMm1 + fibMm2

    # 标记被检查的子数组的起始位置
    offset = -1

    # 当还有元素需要检查时
    while fibM > 1:
        # 检查位置应该是在offset之后的第fibMm2个位置
        i = min(offset + fibMm2, n - 1)

        # 如果x大于当前索引的值,向右子数组移动
        if arr[i] < x:
            fibM = fibMm1
            fibMm1 = fibMm2
            fibMm2 = fibM - fibMm1
            offset = i

        # 如果x小于当前索引的值,向左子数组移动
        elif arr[i] > x:
            fibM = fibMm2
            fibMm1 = fibMm1 - fibMm2
            fibMm2 = fibM - fibMm1

        # 如果找到目标值,返回其索引
        else:
            return i

    # 检查最后一个元素是否是目标值
    if fibMm1 and offset < (n - 1) and arr[offset + 1] == x:
        return offset + 1

    # 如果目标值不存在于数组中,返回-1
    return -1

# 示例数组和目标值
arr = [10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100]
x = 85

# 调用Fibonacci查找函数
result = fibonacci_search(arr, x)

# 打印结果
if result != -1:
    print(f"元素 {x} 在数组中的索引为 {result}")
else:
    print("元素不在数组中")
```

### 逐行解释

1. **函数定义**:
    ```python
    def fibonacci_search(arr, x):
    ```
    - 定义一个名为`fibonacci_search`的函数,接受一个有序数组`arr`和一个目标值`x`作为参数。

2. **初始化Fibonacci数**:
    ```python
    fibMm2 = 0  # (m-2)'th Fibonacci number
    fibMm1 = 1  # (m-1)'th Fibonacci number
    fibM = fibMm1 + fibMm2  # m'th Fibonacci number
    ```
    - 初始化三个Fibonacci数:`fibMm2`(F(m-2)),`fibMm1`(F(m-1))和`fibM`(F(m))。

3. **找到大于或等于数组长度的Fibonacci数**:
    ```python
    n = len(arr)
    while fibM < n:
        fibMm2 = fibMm1
        fibMm1 = fibM
        fibM = fibMm1 + fibMm2
    ```
    - 通过循环找到一个大于或等于数组长度`n`的Fibonacci数。

4. **初始化偏移量**:
    ```python
    offset = -1
    ```
    - 用于标记被检查的子数组的起始位置。

5. **开始查找**:
    ```python
    while fibM > 1:
        i = min(offset + fibMm2, n - 1)
    ```
    - 当还有元素需要检查时,计算检查点位置`i`,它是偏移量加上`fibMm2`,但不能超过数组的长度。

6. **比较当前元素与目标值**:
    ```python
    if arr[i] < x:
        fibM = fibMm1
        fibMm1 = fibMm2
        fibMm2 = fibM - fibMm1
        offset = i
    ```
    - 如果当前元素小于目标值,更新Fibonacci数并调整偏移量`offset`,继续向右子数组查找。

    ```python
    elif arr[i] > x:
        fibM = fibMm2
        fibMm1 = fibMm1 - fibMm2
        fibMm2 = fibM - fibMm1
    ```
    - 如果当前元素大于目标值,更新Fibonacci数,继续向左子数组查找。

    ```python
    else:
        return i
    ```
    - 如果当前元素等于目标值,返回其索引。

7. **检查最后一个元素**:
    ```python
    if fibMm1 and offset < (n - 1) and arr[offset + 1] == x:
        return offset + 1
    ```
    - 检查最后一个元素是否是目标值,如果是,返回其索引。

8. **目标值不在数组中**:
    ```python
    return -1
    ```
    - 如果目标值不存在于数组中,返回-1。

9. **示例数组和目标值**:
    ```python
    arr = [10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100]
    x = 85
    ```

10. **调用Fibonacci查找函数**:
    ```python
    result = fibonacci_search(arr, x)
    ```

11. **打印结果**:
    ```python
    if result != -1:
        print(f"元素 {x} 在数组中的索引为 {result}")
    else:
        print("元素不在数组中")
    ```
    - 根据查找结果打印相应的消息。

希望这个解释能帮助你理解Fibonacci查找算法及其实现过程!

### Fibonacci查找的最好情况和平均情况

#### 最好情况
在最好情况下,Fibonacci查找的时间复杂度是 \(O(1)\)。这种情况发生在以下情形之一:
1. **目标值在数组的初始位置**:如果目标值位于数组的第一个位置,我们只需一次比较即可找到目标值。
2. **目标值恰好位于当前检查点**:如果每次计算的检查点位置刚好是目标值所在的位置,我们可以在最少的比较次数内找到目标值。

#### 平均情况
在平均情况下,Fibonacci查找的时间复杂度约为 \(O(\log n)\)。这是因为该算法在每一步都将搜索范围缩小到一个与Fibonacci数有关的子范围,类似于二分查找。

具体分析:
- Fibonacci查找的核心思想是将数组分割成较大和较小的两部分,这两部分的大小近似于连续的Fibonacci数。
- 每次分割后,算法会递归地在较小的子数组中继续查找,这个过程类似于二分查找,但每次分割的位置不是中点,而是基于Fibonacci数。

### 对比二分查找
- **二分查找**:每次都将数组一分为二,分割点总是中间位置。时间复杂度是 \(O(\log n)\)。
- **Fibonacci查找**:每次的分割点是基于Fibonacci数,分割出来的两个子数组的大小比为黄金分割比(大约是1.618:1)。时间复杂度同样为 \(O(\log n)\),但在某些特定情况下(例如某些硬件架构),可能会更高效。

### 总结
- **最好情况**: \(O(1)\),发生在目标值在数组的初始位置或检查点位置。
- **平均情况**: \(O(\log n)\),与二分查找的时间复杂度相同,但在某些特定情况下,Fibonacci查找可能更高效。

Fibonacci查找与二分查找的主要区别在于分割点的选择。虽然它们的平均时间复杂度相同,但在特定场景下,Fibonacci查找可能具有一定优势。

### 学生与老师的课堂讨论:Fibonacci查找的最坏情况分析

#### 学生A:老师,什么是Fibonacci查找啊?🤔

#### 老师:Fibonacci查找是一种结合了Fibonacci数列和二分查找思想的搜索算法。它主要用于在有序向量中查找目标值,比普通的二分查找更高效一些。

#### 学生B:那它和二分查找有什么不同呢?🧐

#### 老师:区别在于分割点的选择。二分查找总是选择中间点,而Fibonacci查找则使用Fibonacci数列中的位置来选择分割点。这样做可以使得查找过程在某些情况下更快。

#### 学生C:那最坏情况下,成功查找和失败查找的比较次数一样吗?🤨

#### 老师:是的,最坏情况下,无论成功还是失败,Fibonacci查找的比较次数都是一样的。我们可以通过几个具体的例子来理解这一点。

### 例子1:查找成功

#### 老师:假设我们有一个有序向量\[1, 3, 7, 15, 31, 63, 127\],我们要查找值31。

#### 学生A:那我们该怎么做呢?

#### 老师:我们使用Fibonacci数列来选择分割点。首先,我们找到小于或等于向量长度的最大Fibonacci数,这里是8(F8 = 21,而F7 = 13,小于等于7)。

#### 学生B:然后呢?

#### 老师:我们用F8 = 21来分割向量,但因为向量长度只有7,所以我们选择位置6(21 - 13 = 8,8 - 1 = 7,超出范围)。我们选择F7 = 13的分割点,也就是位置4(63)。

#### 学生C:63比31大,所以我们在左边继续查找,对吗?🤔

#### 老师:对的。接下来,我们使用F6 = 8(13 - 8 = 5,5 - 1 = 4),选择位置2(7)。

#### 学生A:7比31小,所以我们在右边查找。接下来呢?

#### 老师:我们用F5 = 5(8 - 5 = 3,3 - 1 = 2),选择位置3(15)。

#### 学生B:15比31小,所以我们继续向右查找。剩下的就是位置4(31)。

#### 老师:没错,最后一步,我们找到31,总共进行了4次比较。

### 例子2:查找失败

#### 老师:现在我们查找值64,还是在同样的有序向量\[1, 3, 7, 15, 31, 63, 127\]。

#### 学生C:我们又要用Fibonacci数列分割,对吗?

#### 老师:对的,步骤和之前相同。首先选择位置4(63)。

#### 学生A:63比64小,我们继续向右查找。接下来是位置6(127)。

#### 老师:对,但127比64大,所以我们在左边继续查找,剩下位置5(空)。

#### 学生B:这就失败了,总共也是4次比较。

### 例子3:查找成功边界值

#### 老师:我们再查找一个有趣的值,比如1或127。

#### 学生C:查找1应该和查找31类似吧?我们会选择位置4(63),然后向左查找位置2(7),再向左查找位置1(3),最后找到位置0(1)。

#### 老师:很好,总共也是4次比较。同样地,查找127会向右逐步缩小范围,最终也是4次比较。

### 总结

#### 学生A:所以无论成功还是失败,最坏情况下,Fibonacci查找的比较次数是一样的,对吗?

#### 老师:没错,这就是Fibonacci查找的一个重要特性。通过使用Fibonacci数列,我们可以确保在最坏情况下,比较次数是相同的,从而提供了稳定的性能。

#### 学生B:明白了!这样讲解真的很有帮助!😊 

#### 老师:很高兴你们能理解。如果还有其他问题,随时提问哦!

 

http://www.dt0577.cn/news/17160.html

相关文章:

  • 宁波网站建设外包seo专员招聘
  • 网站开发和运营合同分开签么百度网页版首页
  • 哪个网站可以做自由行地图合肥seo公司
  • 哪家建设网站seo公司 杭州
  • 软件技术和计算机网络技术哪个好宁波seo网站
  • 上海专业高端网站建设服务竞价托管 微竞价
  • 怎么用源码做网站seo优化排名方法
  • 海搜网做的网站怎么办怎么注册自己的网站域名
  • 金融行业网站制作网站seo属于什么专业
  • 怎样在设计网站做图赚钱吗商品推广软文写作500字
  • 上海在线做网站营销推广活动策划方案
  • wordpress建站两秒打开关键词优化排名用哪些软件比较好
  • 策划公司组织结构图北京seo外包
  • wordpress页面如何排序学seo哪个培训好
  • 湖南衡阳市建设工程造价网站营销推广app
  • 平台是什么意思群排名优化软件官网
  • 微商手机网站制作公司深圳关键词排名推广
  • 公司网站建设内容建议百度网盘下载app
  • 合肥一浪网络科技有限公司seo优化价格
  • 理财网站建设的毕业论文活动策划公司
  • 成都网站优化哪家好今天新闻联播
  • 有哪些国外网站做的好的效果图精准营销的典型案例
  • 怎么样在网站上做跳转乔拓云网站建设
  • 唐山建设公司网站临沂seo建站
  • 做微博这样的网站吗软文广告推广
  • 专业建站公司设计百度推广app
  • 手机网站页面设计百度首页入口
  • 网站百度百科怎么做班级优化大师使用指南
  • 接做网站简介百度主页入口
  • 网站建设课程论文网上推