浙大《数据结构》学习&练习(一)算法初步

1.数据结构是数据在计算机中的组织方式,类比图书在图书馆中的存储,应该如何分类,如何在书架上存取。

2.抽象数据结构是对一类的数据的一种组织方式的通用(抽象)描述,包括类型的名称数据对象集操作集。数据对象集定义了是什么样类型的数据,操作集定义了数据的处理方式。

3.评价算法的优劣使用时间复杂度T(N)空间复杂度S(n)。前者体现了算法占用的时间,后者体现了算法占用的存储空间,都和数据的规模有关。

4.测试程序运行时间的一个传统方法。

#include <time.h>

//clock()会返回程序开始运行到clock()被调用时的时间
//CLK_TCK是个常数,为机器时钟每秒走的打点数

//clock_t是函数clock()的返回类型,即时钟打点clock tick
clock_t start, stop;

double duration;

int main()
{
    //把要测试的内容放在clock()调用的地方
    start = clock();    //start为程序运行到第一次调用的时间

    anyFunction(); //某个函数

    stop = clock();    //stop为程序运行到第二次调用的时间

    duration = ((double)(stop - start)) / CLK_TCK;

}

5.应用实例:求最大子列和问题

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数K (≤);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20

第四种算法精妙就精妙在它的处理思路是一个一个数字处理,简单推导一下,只要当前子列与新加入的数的和是负数,那么新加入的数必定是大于现在的最大和的,那当前子列的结果就可以抛弃,最大的子列直接变成新加入的数本身,然后从该数开始重新累加即可。

测试代码(C++):

#include<iostream>
using std::cout;
using std::cin;

int MaxSubSeqSum2(int A[], int N);
int MaxSubSeqSum4(int A[], int N);

int main()
{
    int Numbers;
    //cout << "How many integer numbers in total?
";
    cin >> Numbers;

    int *A = new int [Numbers];
    //cout << "Enter the numbers:
";
    for (int i = 0; i < Numbers; i++)
    {
        cin >> A[i];
    }
    cout << MaxSubSeqSum4(A, Numbers) << "
";
    delete []A;

    system("pause");
    return 0;

}

/* tranditional algorithm */
int MaxSubSeqSum2(int A[], int N)
{
    int ThisSum;
    int MaxSum = 0;

    /* head begin from 0,1,...,n */
    for (int n = 0; n < N; n++)
    {
        /* ThisSum stores results of every subquene for current head */
        ThisSum = 0;
        for (int j = n; j < N; j++)
        {
            ThisSum += A[j];
            if (ThisSum > MaxSum)
            {
                MaxSum = ThisSum;    /* update MaxSum */
            }
            else
            {
                /* do nothing */
            }
        }
    }
    return (MaxSum > 0 ? MaxSum:0);
}

/* better algorithm */
int MaxSubSeqSum4(int A[], int N)
{
    int ThisSum = 0;
    int MaxSum = 0;

    /* handle one number each time */
    for (int i = 0; i < N; i++)
    {
        ThisSum += A[i];
        if (ThisSum > MaxSum)
        {
            MaxSum = ThisSum;    /* update MaxSum */
        }
        else if (ThisSum < 0)    /* the next number must be larger than MaxSum */
        {
            ThisSum = 0;    /* so current subseq is meaning less */
        }
        else
        {
            /* do nothing */
        }
    }
    return MaxSum;
}
原文地址:https://www.cnblogs.com/banmei-brandy/p/12358391.html