§4.3 多重共线性 Multi-Collinearity. 一、多重共线性的概念 二、实际经济问题中的多重共线性 三、多重共线性的后果 四、多重共线性的检验
2 线性表 (3)
description
Transcript of 2 线性表 (3)
数据结构 --- 线性表
2 2 线性表线性表(3)(3)
数据结构 --- 线性表
1.了解线性结构的特点2.掌握顺序表的定义、查找、插入和删除 3.掌握链表的定义、查找、插入和删除 4.能够从时间和空间复杂度的角度比较两种
存储结构的不同特点及其适用场合5.应用线性结构解决基本问题6.了解 STL中的 vector,list的基本使
用方法
1.了解线性结构的特点2.掌握顺序表的定义、查找、插入和删除 3.掌握链表的定义、查找、插入和删除 4.能够从时间和空间复杂度的角度比较两种
存储结构的不同特点及其适用场合5.应用线性结构解决基本问题6.了解 STL中的 vector,list的基本使
用方法
教学目标
数据结构 --- 线性表
2.1 线性表的定义
2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 线性表与 STL(标准模板库)
2.1 线性表的定义
2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 线性表与 STL(标准模板库)
教学内容
数据结构 --- 线性表
2.4 线性表与 STL
(标准模板库)1.vector与顺序表2.list与链表
数据结构 --- 线性表
vector 举例:合并顺序表// 方法 1#include <vector>//……vector<int> va(n), vb(m);// 分别为 va,vb 输入数据
for(int i=0; i<vb.size(); i++){
va.push_back(vb[i]);}
cout<<va.size()<<endl;// n+m
// 方法 2 顺序表 vb 最后被清空#include <vector>//……vector<int> va(n), vb(m);// 分别为 va,vb 输入数据
while(vb.empty()==false)
{
va.push_back(vb.front());
vb.erase(vb.begin());
}
cout<<va.size()<<endl; // n+m
方法 1 的算法时间复杂度为 O(n)
方法 2 的时间复杂度为?
数据结构 --- 线性表
list 举例:合并有序链表#include <list> // 方法 1//……int a[5] = {19,3,6,7,12} , b[4] = {22,7,19,6};list<int> La, Lb;list<int> ::iterator it; // 迭代器,本质就是指向链表结点的指针
// 一次性将指定长度的数组元素加入链表La.insert (La.begin(), a, a + 5); Lb.insert (Lb.begin(), b, b
+ 4);La.sort(); Lb.sort(); // 链表排序
La.merge (Lb); // 合并两个有序链表;// 输出for (it = La.begin(); it != La.end(); it++) // 3 6 6 7 7 12 19
19 22cout << *it << " ";
cout << endl;
算法时间复杂度依赖于 STL的处理效率,大概为 O(n2)
数据结构 --- 线性表
list 举例:合并有序链表list<int> La, Lb;list<int> ::iterator it1,it2; // 迭代器,本质就是指向链表结点的指针// 分别向 2 个链表添加若干有序元素La.insert (La.end(), 3); La.insert (La.end(), 6); La.insert
(La.end(), 12);Lb.insert (Lb.end(), 6); Lb.insert (Lb.end(), 7); Lb.insert
(Lb.end(), 22);
it1=La.begin();for(it2=Lb.begin(); it2!=Lb.end(); it2++) // 合并有序链表{
while(it1!=La.end() && *it1<*it2) it1++; // 寻找合适的插入位置La.insert(it1, *it2);
}// 输出for (it1 = La.begin(); it1 != La.end(); it1++) // 3 6 6 7 12 22
cout << *it1 << " ";cout << endl; 算法时间复杂度为 O(n)
数据结构 --- 线性表
应用举例: 利用链表实现大整数处理// 利用链表实现大整数加法运算// 链表存储顺序 : 个位在前,高位在后// Lc=La+Lblist<int> BigAddList(list<int> La,
list<int> Lb){
list<int> Lc;list<int> ::iterator it1,it2; it1=La.begin();it2=Lb.begin();
// 循环处理代码见右边// ……if(carry>0) Lc.push_back(carry);return Lc;
} // 其实 list 就是双向链表,完全可以用指针 直接逆序处理,但代码书写稍稍麻烦
int carry=0; // 处理进位while(it1!=La.end() || it2!
=Lb.end()){
int c=carry;if(it1!=La.end()) {
c = c + (*it1);it1++;
}if(it2!=Lb.end()) {
c = c + (*it2);it2++;
}carry=c/10;Lc.push_back(c%10);
}
时间复杂度为O(n)
数据结构 --- 线性表
// 函数 BigAddList 调用示例:int main(){
list<int> La, Lb, Lc;list<int> ::iterator it1,it2,it3; // 链表存储顺序 : 个位在前,高位在后 3672+872=4544 La.push_front(3); La.push_front(6);
La.push_front(7); La.push_front(2);// 2 种不同的插入方法 , 效果相同Lb.insert (Lb.begin(), 8); Lb.insert (Lb.begin(), 7);Lb.insert (Lb.begin(), 2);Lc=BigAddList(La, Lb);Lc.reverse(); // 逆置链表,仅仅为了方便输出for (it3 = Lc.begin(); it3 != Lc.end(); it3++)
cout << *it3 << " ";cout <<endl;return 0;
}
数据结构 --- 线性表
LA
2 7 6 3
LB
2 7 8
LC
4 4 5 4
carry=01
it1
it2
it1 it1 it1
it2 it2
it1
it2
数据结构 --- 线性表
1 )理解基本概念2 )掌握逻辑结构3 )掌握存储结构,实现各种基本操作4 )利用基本原理和方法,能够对算法进行设计或分析5 )能够选择合适的数据结构和方法进行问题求解
本课程的知识掌握及考查的要求
数据结构 --- 线性表
本章小结1 、线性表的逻辑结构特性是数据元素之间存在着线性关系;在计算机中表示这种关系的两类不同的存储结构是顺序存储结构(顺序表)和链式存储结构(链表)。
2 、熟练掌握两类存储结构的描述方法,掌握链表中的头结点、头指针和首元结点的区别。
3 、熟练掌握顺序表的查找、插入和删除算法 4 、熟练掌握链表的查找、插入和删除算法5 、能够从时间和空间复杂度的角度比较两种存储结构的不同特点及其适用场合
1 、线性表的逻辑结构特性是数据元素之间存在着线性关系;在计算机中表示这种关系的两类不同的存储结构是顺序存储结构(顺序表)和链式存储结构(链表)。
2 、熟练掌握两类存储结构的描述方法,掌握链表中的头结点、头指针和首元结点的区别。
3 、熟练掌握顺序表的查找、插入和删除算法 4 、熟练掌握链表的查找、插入和删除算法5 、能够从时间和空间复杂度的角度比较两种存储结构的不同特点及其适用场合
数据结构 --- 线性表
内容 要求线性表的概念和特点 熟练掌握线性表的抽象数据类型定义 基本掌握
顺序表和链表的定义和组织形式 掌握线性表的顺序存储方式的实现 熟练掌握
线性表(单链表、循环链表)的链式存储方式的实现 熟练掌握线性表(双向链表)的链式存储方式的实现 掌握比较顺序表与链表的优缺点,掌握其各自适用的场合 掌握应用线性结构解决基本的问题 掌握利用 STL 中的 vector,list 解决基本的问题 掌握一元多项式的表示和相加 课外阅读
本章详细要求:
数据结构 --- 线性表
课后建议:
HLoj 8801-8808,8812-8824 HDoj 1002, 1715,1753 (大整数加
法)大整数加法的效率: vector 优于 string 优
于 list