ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:335.48KB ,
资源ID:24447780      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24447780.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构数组学习笔记.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构数组学习笔记.docx

1、数据结构数组学习笔记数组学习笔记1、java中的数据类型分类: 基本数据类型(或叫做原生类、内置类型)8种: 整数:byte,short,int,long(默认是int类型) 浮点类型: float,double(默认是double类型) 字符类型:char 布尔类型:boolean引用数据类型3种:数组,类,接口其中,基本数据类型之间除了boolean,其他数据类型之间可以任意的相互转换(强制转化或默认转换),这个与c+中有点区别。数组是对象,int float char这些基本类型不是对象。关于如何判断基本类型和对象,参考下面的:行为:基本类型只是一个值,没有任何行为对象类型有自己的行为内

2、存分配:基本类型在栈内分配对象在堆内分配对象引用保存在栈内引用与值:基本类型是值类型,仅表示一个值,保存在栈内引用类型分两部分,对象引用保存在栈内,对象保存在堆内,访问变量,是使用的引用找对象2、对一个排好序的数组进行查找,时间复杂度为()二分查找:n,n/2,n/4令n/2*k=1. 得 k=log2n(以2为为底的对数)3、short int : 2个字节sizeof返回的值表示的含义如下(单位字节):数组编译时分配的数组空间大小;指针存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);类型该类型所占的空间大小;对象对象的实际占用空间大小;函数函数的返回类型所占的空间大

3、小。函数的返回类型不能是void。short a100 空间100*24、和顺序栈相比,链栈有一个比较明显的优势是通常不会出现栈满的情况链栈存在于不连续的内存中,依靠节点指向后一个节点的指针进行地址查找顺序栈就是数组,在内存中是连续的5、(1)数据结构对广义表的表头和表尾是这样定义的:如果广义表LS=(a1,a2.an)非空,则 a1是LS的表头,其余元素组成的表(a2,a3,.an)是称为LS的表尾。根据定义,非空广义表的表头是一个元素,它可以是原子也可以是一个子表,而表尾则必定是子表。例如:LS=(a,b),表头为a,表尾是(b)而不是b.另外:LS=(a)的表头为a,表尾为空表().(2

4、)非空广义表,除表头外,其余元素构成的表称为表尾,所以非空广义表尾一定是个表。广义表即我们通常所说的列表(lists)。它放松了对表元素的原子性限制,允许他们有自身结构。广义表的长度:最大括号中的 逗号数+1广义表的深度:展开后含括号的层数。广义表的特性:广义表的元素可以是子表,而子表的元素还可以是子表。广义表可为其他广义表所共享。广义表可以是一个递归的表,即广义表也可以是其本身的一个子表广义表(a,b,c),d,e,f)的长度为4,4个元素分别为子表(a,b,c )和单元素d,e,f。二维以上的数组其实是一种特殊的广义表6、假设以行优先顺序存储三维数组A567,其中元素A000的地址为110

5、0,且每个元素占2个存储单元,则A432的地址是()三维比如说是x,y,z组成的立体,按行存储就是先存yz面,三维数组am1m2m3中若按行优先存储,设a000的起始地址为p,每个元素占n个单元,则aijk的起始地址为:loc(i,j,k)=loc(i,0,0)+(j*m3+k)*n=loc(i-1,0,0)+(m2*m3+j*m3+k)*n=loc(i-2,0,0)+(2*m2*m3+j*m3+k)*n=p+(i*m2*m3+j*m3+k)*n则loc(4,3,2)=1100+(4*6*7+3*7+2)*2=1482。7、从逻辑结构上看,n维数组的每个元素均属于n个向量,像2为数组的每个元素

6、属于2个向量Z(x,y),通俗的说,在Z中增加一维,也就是在每个元素增加一类属性,也就是增加一个向量,此时Z中每个元素已经对应三种属性(向量).同理,n维数组的每个元素均属于n个向量.8、给定一个m行n列的整数矩阵(如图),每行从左到右和每列从上到下都是有序的。判断一个整数k是否在矩阵中出现的最优算法,在最坏情况下的时间复杂度是_。杨氏矩阵查找算法:从矩阵的右上角开始,若右上角元素大于所找,则可右上角元素所在的列的所有元素均大于所找元素,下次查找忽略该列;若右上角元素小于所找,则右上角元素所在行的所有元素均小于所找元素,下次查找,忽略该行;若相等,结束查找;否则,由新形成的矩阵利用上述方式继续

7、查找。O(m+n).8、数组与指针的区别(1)数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。(2)用运算符sizeof 可以计算出数组的容量(字节数)(3)指针可以随时指向任意类型的内存块。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a = “hello”;a0 = X;char *p = “world”; / 注意p 指向常量字符串p0 = X; / 编译器不能发现该错误,运行时错误(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字

8、节数,而不是p 所指的内存容量。C+/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a = hello world;char *p = a;cout sizeof(a) endl; / 12 字节cout sizeof(p) endl; / 4 字节计算数组和指针的内存容量void Func(char a100)cout sizeof(a) .=j时,k=i(i-1)/2+j-1; 当ij时, k=j(j-1)/2+i-1;22、在程序设计中,要对两个16K16K的多精度浮点数二维数组进行矩阵求和时,

9、行优先读取和列优先读取的区别是行优先快23、关于 int a10; 问下面哪些不可以表示 a1 的地址?A. a+sizeof(int) / 不正确, 在32位机器上相当于指针运算 a + 4B. &a0+1 / 正确,数组首元素地址加1,根据指针运算就是a1的地址C. (int*)&a+1 / 正确,数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思D. (int*)(char*)&a+sizeof(int)/ 正确,数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为int*,显然是a1的地址24、若某线性表最常用

10、得操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪顺序表存储方式最节省时间。线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算;进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表。而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。25、已知数组D的定义是int D48;,现在需要把这个数组作为实参传递给一个函数进行处理。下列说明汇总可以作为对应的形参变量说明的是()。int(*s)8,int D8int *s8; /定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再

11、定义了。 int (*s)8; /定义一个数组指针,该指针指向含8个元素的一维数组(数组中每个元素是int型)。 区分int *pn; 和int (*p)n; 就要看运算符的优先级了。 int *pn; 中,运算符 优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。 int (*p)n; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。26、线性表的顺序存储结构是一种随机存取的存储结构,顺序存储就是以数组的形式存储,那我们取某个元素就可以直接以下标的形式取出,不需要像链表那样从头遍历,所以是随机存取27、对n个记录的线性表进行快速排序为减少算法的递归深度,

12、每次分区后,先处理较短的部分。在快速排序中,需要使用递归来分别处理左右子段,递归深度可以理解为系统栈保存的深度,先处理短的分段再处理长的分段,可以减少时间复杂度;如果按长的递归优先的话,那么短的递归会一直保存在栈中,直到长的处理完。短的优先的话,长的递归调用没有进行,他是作为一个整体保存在栈中的,所以递归栈中的保留的递归数据少一些。28、三元组转置: (1)将数组的行列值相互交换 (2)将每个三元组的i和j相互交换 (3)重排三元组的之间的次序便可实现矩阵的转置29、数组比线性表速度更快的是原地逆序(1)原地逆序(2)返回中间节点(3)选择随机节点30、A,线性表逻辑上是线性的,存储上可以是顺

13、序的,可以是链式的B,顺序存储和链式存储各有优缺点C,链式存储可以连续,可以不连续,存储时不管其连续还是不连续,都是用指针指向下一个结点D,二维数组是顺序存储的线性表,其元素都是线性表的元素,二维数组是其数组元素为线性表的线性表。E,插入、删除和搜索是数据结构应该具备的基本操作31、用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j沿链移动的操作为j=rj.next。32、当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是list。C+ STL 的实现:(1).vector 底层数据结构为数组 ,支持快速随机访问(2).list 底层数据结构为双向链表,支

14、持快速增删(3).deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问(4).stack 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时(5).queue 底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时(6).45是适配器,而不叫容器,因为是对容器的再封装(7).priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现(8).set 底层数据结构为红黑树,有序,不重复(9).multi

15、set 底层数据结构为红黑树,有序,可重复 (10).map 底层数据结构为红黑树,有序,不重复(11).multimap 底层数据结构为红黑树,有序,可重复(12).hash_set 底层数据结构为hash表,无序,不重复(13).hash_multiset 底层数据结构为hash表,无序,可重复 (14).hash_map 底层数据结构为hash表,无序,不重复(15).hash_multimap 底层数据结构为hash表,无序,可重复 33、在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度.。如下,1,2,3可以通过编译,4,5不行。而St

16、ring是Object的子类,String a、Stringa、Object a均可定义一个存放50个String类型对象的数组。(1). String a=new String50;(2). String b;(3). char c;(4). String d50;(5). char e50;34、几种常见的数据结构的操作性能对比如下图所示由上图可见,平衡二叉树的查找,插入和删除性能都是O(logN),其中查找和删除性能较好;哈希表的查找、插入和删除性能都是O(1),都是最好的。35、有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以

17、存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?A按行存,B按行存。我们来看看传统的分块矩阵相乘:很明显依然是行乘以列的方式。再来看看Strassen矩阵相乘:同样是分块,只是计算方式不同很明显,涉及到行的加法(a+b,c+d,e+f,g+h),列的减法(f-h,g-e,b-d,a-c),对角线的加法(a+d,e+h)以及行列的乘法,所以无论是 A按行存,B按行存。 A按行存,B按列存。计算速度都是差不多的。36、既希望较快的查找又便于线性表动态变化的查找方法是哈希法查找37、在

18、一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行(9)次比较: 比如 A B C D E F G H,通过8进4的方式,A与B比较, C与D比较.然后再4进2,A与C比较(假设A,C比B,D大),E与G比较。再2进1,比如A与E比较(假设A,E比C,G大)选出最大的A,总共7次。 然后次大的数一定是被最大数PK下去的,所以再选B C E三个比较2次得到次大的数 A A E A C E G(7次) A B C D E F G H 再选 BCE中最大的(2次),共9次,不过可以这个方法比较次数是少一点,但是所需要的空间大,要记下与沿途的最大值比较的数。38、数组指

19、针和指针数组有什么区别 数组指针只是一个指针变量,它占有内存中一个指针的存储空间;指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间;数组指针(也称行指针) 定义 int (*p)n;()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a34;int (*p)4; /该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; /将该二维数组的首地址赋给p,也就是a0或&a00 p+; /该语句执行过后,也就是p=p+1;p跨

20、过行a0指向了行a1所以数组指针也称指向一维数组的指针,亦称行指针。指针数组 定义 int *pn;优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p0、p1、p2.pn-1,而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。如要将二维数组赋给一指针数组:int *p3;int a34;for(i=0;i21,故1和7对调,对调后顶层1 第二层 2 7 第三层 4 3 9 5 第四层 8 6;因

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1