《编程珠玑》阅读小记(6) — 算法设计技术

本章简述

通过前面第二章节的叙述,描述了算法设计对程序员的日常影响:算法上的灵机一动可以使程序更加简单。但是本章内容将会发现算法设计的一个不那么常见但更富于戏剧性的贡献:复杂深奥的算法有时可以极大地提高程序性能。

问题及简单算法

本章引入的问题来自一维的模式识别,问题的输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。

例如,如果输入向量包含以下 N = 10 个元素:

arr[N] = { 31, -41, 59, 26, -53, 58, 97, -93, -23, 84 }

那么该程序的输出为x[2…6]的总和,即187。

该问题分为以下几种情况:

  • 当所有数都是正数时,此时最大子向量就是整个输入向量;
  • 当所有数都是负数时,此时最大子向量就是空向量,总和为0;
  • 当输入向量正负均有时,此时最大子向量需要特殊处理;

对该问题,本章讨论了4种算法,性能逐步提高。

  • 算法1的时间复杂度为T(n)=O(n^3);
  • 算法2及2b的时间复杂度为T(n)=O(n^2);
  • 算法3的时间复杂度为T(n)=O(nlogn);
  • 算法4的时间复杂度为T(n)=O(n);

下面将下面4个算法,详细给出程序实现。

立方算法

完成该问题的浅显程序对所有满足区间的(i,j)的整数对进行迭代。对每个整数对,程序都要计算x[i…j]的总和,并检验是否大于迄今为止的最大总和。算法程序实现如下:

/************************************************************************/
/*
 * 《编程珠玑》第八章 算法设计技术
 * 问题:输入具有n个浮点数的向量x ,输出向量中任何连续子向量中的最大和
 * 算法一:T(n) = O(n^3)
 */
/************************************************************************/

#include <iostream>
#include <cstdlib>

using namespace std;

/************************************************************************/
/*
 * 算法说明:
 *(1)当所有输入都是正数时,最大子向量就是整个输入向量
 *(2)当所有输入都是负数时,最大子向量是空向量,和为0
 *(3)当前处理情况是,输入序列有正有负
 */
/************************************************************************/
float maxSubSum(const float *arr, const int N , int &begin , int &end)
{
    float maxsofar = 0 ;
    for (int i = 0; i < N; i++)
    {
        for (int j = i; j < N; j++)
        {
            float sum = 0;
            for (int k = i; k <= j; k++)
            {
                sum += arr[k];
            }

            if (sum > maxsofar)
            {
                maxsofar = sum;
                begin = i;
                end = j;
            }
        }
    }

    return maxsofar;
}

const int N = 10;
const float arr[N] = { 31, -41, 59, 26, -53, 58, 97, -93, -23, 84 };

int main()
{
    cout << "The input numbers are: " << endl;

    for (int i = 0; i < N; i++)
        cout << arr[i] << "\t";
    cout << endl << "The max sum is : " ;

    int begin = -1, end = -1;
    cout << maxSubSum(arr, N , begin , end) <<endl;

    cout << "The position is : " << begin << "\t" << end << endl;

    system("pause");
    return 0;
}

平方算法1

对于之前的立方算法性能不尽如人意,下面有一个明显的方法可以使其运行起来快得多,

时间: 2024-10-13 12:59:15

《编程珠玑》阅读小记(6) — 算法设计技术的相关文章

常用算法设计技术总结

算法,即计算的方法,使用计算的思想.方法.工具和技术来实现问题求解的思路和途径.计算机提供了计算的能力和硬件设施:算法则提供了计算的思想和软件技术,更好地发挥计算机的潜能. —— 引 有人说,算法无用,这种观点就如同盲人看不到花开就说世界上没有花一样,是一个长眼睛的人无论如何也难以接受的.举个简单的例子,假如你要对1000,000条记录进行排序,你的计算机每秒可处理1000,000 条记录, 那么, 如果你选择 O(nlogn)的快速排序,所花时间大约是 log2(1000000) = 20s,

编程珠玑阅读笔记01

薄薄的一本书,丝毫无愧于珠玑两个字. 看了第一章,我对这本书佩服得五体投地.一个简洁的小例子,几个看似简单的算法,实际上包含了很多算法设计的思想.看完第一章,我对数据库的几种外排算法有了更深层次的理解 习题:位图和位向量来表示集合 例如集合{1,2,3,5,8,13}可表示为:`0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0` (从左到右为第0~19位) 文中巧妙的对整数集合排序的思路分三步:  1. 数组所有位初始为0 2. 将输入的整数n当作index来用,出

[第8章]算法设计技术——一维模式识别

第八章主要介绍了一维模式识别的算法改进过程.问题输入:n个浮点数的向量x. 问题输出:任何连续子向量中的最大和. (1)首先从最直观的做法入手,就是枚举所有情况下的子向量的和,最后比较出最大的和.首先,利用两层for循环,列出了所有可能的子向量,在用一层for循环,求出子向量的和.运算时间为O(n^3). int MaxNum1(int* a,int _len) { int maxNum=0; for(int i=0;i<_len;i++) { for(int j=i;j<_len;j++)

《编程珠玑》高清pdf版

下载地址:网盘下载 作者简介 编辑 Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998年就成为Dr. Dobb's Joumal杂志的特约编辑,他的"编程珠玑"专栏多年来一直是顶级学术杂志Communications of the ACM最风行的特色专栏之一,而本书正是建立在这些专栏的基础之上. 目录 编辑 第一部分 基础 第1章 开篇 1.1 一次友好的对话 1.2 准确的问题描述 1.3 程序设计 1.4

编程珠玑 第2版 pdf

下载地址:网盘下载 内容简介  · · · · · · 本书是计算机科学方面的经典名著.书的内容围绕程序设计人员面对的一系列实际问题展开.作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的.本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路.本书对各个层次的程序员都具有很高的阅读价值.. 多年以来,当程序员们推选

编程珠玑高清pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 作者简介编辑Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998年就成为Dr. Dobb's Joumal杂志的特约编辑,他的“编程珠玑”专栏多年来一直是顶级学术杂志Communications of the ACM最风行的特色专栏之一,而本书正是建立在这些专栏的基础之上.目录编辑第一部分 基础 第1章 开篇 1.1 一次友好的对话 1.2 准确的问题描述 1.3 程序设计 1.4

《编程珠玑》---笔记。浏览此文,一窥此书。

第一章: 磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案.要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案. 比如:文中:最初的需求只是"我如何对磁盘文件排序". 我们首先想到了经典的归并排序. 但,进一步了解到排序的内容是10000000个记录,每条记录都是一个7位整数,且只有1M可用的内存.每条记录不相同. [位示图法,详见我的关于排序的博文] 第二章: 三个问题: 1.给定一个包含32位整数的顺序文件,它至多只能包含40亿个这样的整数,并且整数

《编程珠玑》

第1章 开篇 问题: 输入: 一个最多包含n个正整数的文件,每个数都小于n,其中n=107.如果在输入文件中有任何整数重复出现就是致命错误.没有其它数据与该整数相关联. 输出: 按升序排列的输入整数的列表. 约束: 最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用.运行时间最多几分钟,运行时间10秒就不需要进一步优化了. 解决方案: 位向量     //phase 1:initialize set to empty         for i = [0,n)            

《编程珠玑》第二部分总结

第二部分主要讲效率,重点是提高性能,使得用户使用方便简捷. 第6章介绍了提高运行效率的一种不同方法,介绍了部分如何一起组成了一个整体,通过研究一个案例,转向研究系统设计层次,进行系统化的了解. 第7章介绍了在早期的设计过程中使用的称为“封底”计算,确保系统结构具有足够的效率,进行性能估计和安全系数的确立. 第8章讲了有关算法设计技术方面的内容,这些技术能够显著的降低模块运行时间,使程序更简单,通过一个小问题介绍了4个算法. 第9章讨论了代码的优化,它可以使程序的性能大不一样. 第10章说明了性能