浙大《数据结构》学习&练习(一)算法初步
2024-10-09 21:46:00
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?\n";
cin >> Numbers; int *A = new int [Numbers];
//cout << "Enter the numbers:\n";
for (int i = 0; i < Numbers; i++)
{
cin >> A[i];
}
cout << MaxSubSeqSum4(A, Numbers) << "\n";
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;
}
最新文章
- IT girl
- restful
- dp和px转换
- emacs org mode 中的标签全参考
- NISSAN 尼桑 J1962 诊断座
- 网络流(最小费用最大流):POJ 2135 Farm Tour
- java的CalssLoader
- [笔记]机器学习(Machine Learning) - 02.逻辑回归(Logistic Regression)
- java考试易错题大全
- Memcached统计命令
- 2018年10月OKR初步规划
- 二、.Net 连接mycat
- VM VirtualBox – Cannot register the hard disk
- @SuppressLint("HandlerLeak"),或Handler使用有警告;
- asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理
- python dataframe astype 字段类型转换
- 服务端JSON内容中有富文本时
- 用原生JS实现getElementsByClass
- BusyBox inittab配置
- vue从安装到初始化项目