美文网首页
算法分析与设计技巧(开篇绪论)

算法分析与设计技巧(开篇绪论)

作者: AndyDennisRob | 来源:发表于2020-03-05 23:50 被阅读0次

由于《算法设计技巧与分析》沙特M.H.Alsuwaiyel著中国工信出版集团 一书中的代码都是伪代码,这里我想借自己绵薄之力用c++实现一下。

先来看看求和公式(图片来源于知乎,百度百科和360百科):


平方和公式
等差数列求和公式 等比数列求和公式.png

接着我们来看看1-2 binarySearch二分搜索。

//传入一个有序数组,x 为要寻找的目标值
int binarySearch(const int* a,int n, int x){
    int low = 0, high = n - 1, j = -1;
    while(low <= high && j == -1){
        int mid = (low + high) / 2;
        if(a[mid] == x)
            j = mid;
        else if (x < a[mid])
            high = mid - 1;
        else
            low = mid + 1;
    }
    return j;
}

我们可以写个例子测试一下

int main(){
    //写个例子测试一下
    int a[] = {1,10,20,30,40,50,60,70,80,90,100};
    int number = sizeof(a) / sizeof(int);
    int x = 101;//试试其他值...
    int result = binarySearch(a, number, x);
    if(result != -1)
        cout << "找到了,在索引 " << result << endl;
    else
        cout << "没找到" << endl;
    return 0;
}



定理1.1: 对于一个大小为n的排序数组,算法binarySearch执行比较的最大次数为
\lfloor logn \rfloor + 1

这里我们多事一点,我们看到P32的1.15练习的1.1题。

令A[1...60] = 11,12,...,70,用二分算法搜索下列x值时执行了多少次比较运算?
(a) 33 (b) 7 (c) 70 (d) 77

我们这里用程序跑一下它,由于它是从1开始的,我们这里也改一下程序。把数组A从1开始。

int binarySearchCountTime(const int *a, int n, int x) {
    int low = 1, high = n, j = -1;
    int time = 0;
    while (low <= high && j == -1) {
        int mid = (low + high) / 2;
        if (a[mid] == x)
            j = mid;
        else if (x < a[mid])
            high = mid - 1;
        else
            low = mid + 1;
        time++;
    }
    cout << "比较次数" << time << endl;
    return j;
}

主函数

int main() {
    //写个例子测试一下
    int a[61];
    for (int i = 0; i <= 60; i++)
        a[i] = i + 10;
    int number = 60;
    int target[4] = {33, 7, 70, 77};
    for (int i : target) {
        binarySearchCountTime(a, number, i);
    }
    return 0;
}
运行结果


合并两个有序小序列:
//执行后a升序排列,数组b为辅助数组
void merge(int *a, int *b, int p, int q, int r) {
    int s = p, t = q + 1, k = p;
    while (s <= q && t <= r) {
        if (a[s] <= a[t])
            b[k++] = a[s++];
        else
            b[k++] = a[t++];
    }
    if (s == q + 1)
        for (int i = t; i <= r; i++)
            b[k++] = a[i];
    else
        for (int i = s; i <= q; i++)
            b[k++] = a[i];
    for (int i = p; i <= r; i++)
        a[i] = b[i];
}

记得小序列是有序的。写个测试

int main() {
    int a[8] = {1627, 1896,3147,3605,2957,3000,3592,3959};
    int b[8] = {0};

    merge(a, b, 0, 3, 7);

    for (int i : a)
        cout << i << " ";
}

输出:

1627 1896 2957 3000 3147 3592 3605 3959

相关文章

  • 算法分析与设计技巧(开篇绪论)

    由于《算法设计技巧与分析》沙特M.H.Alsuwaiyel著中国工信出版集团 一书中的代码都是伪代码,这里我想借自...

  • 《算法设计技巧与分析》

    沙特版,电子工业出版社 【递归】 归纳法 从求解一个小参数的相同问题开始,把解推广到所有物体。 选择排序:依次选择...

  • 算法设计与分析(第3版)

    《算法设计与分析(第3版)》系统地介绍了算法设计与分析的概念和方法,共4篇内容。第1篇介绍算法设计与分析的基本概念...

  • 机器学习 -- 绪论(一)人工智能定义

    课程内容安排 机器学习绪论 Python语言基础 分类算法及应用实践 回归算法及应用实践 聚类算法与关联分析 深度...

  • 如何学习数据结构与算法

    算法学习经验 推荐: 入门: 数据结构启蒙:《数据结构与算法分析——C 语言描述》 算法启蒙:《算法设计与分析基础...

  • 给我巨大影响的技术书籍

    算法《算法概论》《算法设计与分析基础》 Anany Levitin《算法引论》Udi Manber《算法导论》《什...

  • 递归算法设计

    递归是程序设计中一个很重要的课题。用递归技术设计的算法简单明了。递归算法的设计与分析是算法设计与分析的一大类。 首...

  • 数据结构笔记(一)

    第1章 数据结构绪论 第2章 算法 第3章 线性表 第1章 数据结构绪论 程序设计 = 数据结构 + 算法 逻辑结...

  • 算法设计与分析导论

    《算法设计与分析导论》本书在介绍算法时,重点介绍用干设计算法的策略.非常与众不同。书中介绍了剪枝搜索、分摊分析、算...

  • 证明:d次多项式的同阶函数集合为n^d

    骆先生算法设计与分析第二章内容

网友评论

      本文标题:算法分析与设计技巧(开篇绪论)

      本文链接:https://www.haomeiwen.com/subject/xildrhtx.html