1、稀疏矩阵一般采用三元组顺序表方法压缩存储 。 ( )
正确答案: A 你的答案: A (正确)
正确
错误
分析:
稀疏矩阵有两种压缩存储方式,一个是三元组,一个是十字链表,两者各有适用环境。
2、下面哪项是数组优于链表的特点?
正确答案: D 你的答案: D (正确)
方便删除
方便插入
长度可变
存储空间小
分析:
数组优于链表的:
1.内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息.但是数组在建立时就固定了.所以也有可能会因为建立的数组过大或不足引起内存上的问题.
2.数组内的数据可随机访问.但链表不具备随机访问性.这个很容易理解.数组在内存里是连续的空间.比如如果一个数组地址从100到200,且每个元素占用两个字节,那么100-200之间的任何一个偶数都是数组元素的地址.可以直接访问.链表在内存地址可能是分散的.所以必须通过上一节点中的信息找能找到下一个节点.
3.查找速度上.这个也是因为内存地址的连续性的问题.不罗索了.链表优于数组的:
1.插入与删除的操作.如果数组的中间插入一个元素,那么这个元素后的所有元素的内存地址都要往后移动.删除的话同理.只有对数据的最后一个元素进行插入删除操作时,才比较快.链表只需要更改有必要更改的节点内的节点信息就够了.并不需要更改节点的内存地址.
2.内存地址的利用率方面.不管你内存里还有多少空间,如果没办法一次性给出数组所需的要空间,那就会提示内存不足,磁盘空间整理的原因之一在这里.而链表可以是分散的空间地址.
3.链表的扩展性比数组好.因为一个数组建立后所占用的空间大小就是固定的.如果满了就没法扩展.只能新建一个更大空间的数组.而链表不是固定的,可以很方便的扩展.
3、char str[]=”Hello”,sizeof(str)=()
正确答案: C
4
5
6
7
分析:
sizeof计算长度包括字符串结束符\0,实际存储为{'H','e','l','l','o','\0'},所以是6个
4、下列叙述中正确的是( )
正确答案: B
有一个以上根结点的数据结构不一定是非线性结构只有一个根结点的数据结构不一定是线性结构循环链表是非线性结构双向链表是非线性结构
分析:
线性结构应满足:有且只有一个根结点与每个结点最多有一个前件,也最多有一个后件,所以 B 正确。所以有一个以上根结点的数据结构一定是非线性结构,所以 A 错误。循环链表和双向链表都是线性结构的数据结构。
5、若已定义: int a[]=[0,1,2,3,4,5,6,7,8,9],*p=a,i; 其中0≤i≤9,则对a数组错误的引用是()
正确答案: D 你的答案: D (正确)
a[p-a]
*(&a[i])
p[i]
a[10]
分析:
数组名就是数组的首地址,此时p和a相等,即[p-a]就是 a[0]。指针是有减法的,不过只在数组之中应用,用来表示元素的个数的差. 这里 p 和 a其实是相等的,所以A答案等价与 a[0].
*(&a[i])就是a[i] p[i]相当于a[i] p+i是指向数组a[i]的指针。
6、在一个长度为n的顺序表中删除第i个元素(1<=i<=n)时,需向前移动 () 个元素
正确答案: A
n-i
n-i+1
n-i-1
i
分析:
在一个长度为n的顺序表中删除第i个元素时,i的后面还有n-i个元素,删除i之后将i后面的所有元素都要向前移动一个位置
7、当很频繁地对序列中部进行插入和删除操作时,应该选择使用的容器是()
正确答案: B 你的答案: B (正确)
vector
list
deque
stack
分析:
vector表示一段连续的内存区域,随机访问效率很高,因为每次访问离起始处的位移都是固定的,但是在随意位置插入删除元素效率很低,因为它需要将后面的元素复制一遍。
list表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list的任意位置插入和删除元素的效率都很高:指针必须被重新赋值,但不需要用拷贝元素来实现移动。他对随机访问支持不好,需要遍历中间的元素。每个元素有两个指针的额外空间开销。
deque(双端队列,发音为'deck')也表示一段连续的内存区域,但是他支持高效的在其首部插入和删除元素。 选择顺序容器类型的一些准则: 如果我们需要随机访问一个容器,则vector要比List好得多。 如果我们一直要存储元素的个数,则vector又是一个比list好的选择。 如果我们需要的不只是在容器两端插入和删除元素,则list显然比vector好。 除非我们需要在容其首部插入和删除元素,否则vector要比deque好。
8、对以下二维数组的正确声明是( )
正确答案: C
int a[3][];float a(3,4)double a[][4];float a(3)(4);
分析:
int[][] a=new int[][3];
int[][] b=new int[3][];
Java中,后一种是正确的。前一种是错的。
数组存储数据是行优先存储,如果只定义行不定义列数组存储就没有界限。给出总元素个数,行数等于总元素对列数取整。编辑器会根据列数去计算行数,但不会根据行数去计算列数。
数组声明的时候可以行列一起声明大小,也可以只声明列,但是不能只声明行。
9、Asume you have an object to describe customer data:{ ID(5 digit numeric) Family Name(string) Account Balance(currency) } If you have 500,000 Chinese customers records represented by instances of this object type , what set of data structures is best to get fast retrieval of customers (1) get IDs from Name and (2) getName -> ID 就是 string -> int,字符串最好用 Hash 或 Tree 来索引,不过由于 Name 不是唯一的,一个 Name 可能对应多个 ID,要用 Linked List 做对应过来的结构。所以可以是 Hash + Linked List 或 Tree + Linked List。(Tree 可以用 Trie,复杂度是 O(length(name)),其实 Hash 会更好,理论上复杂度是 O(1))。
ID -> Name 就是 int(7 digit) -> string,7 位数也就是 1000 w,可以开得下(人家机子好),所以就可以随机查了。 Name from ID?
正确答案: B 你的答案: B (正确)
(1) Tree with Hash(100 bucket) at leaves(2) Tree with linked list at leaves.(1) Tree with linked list at leaves(2) Array.(1) Tree with linked list at leaves(2) Hash(10,000 buckets)(1) Sort linked list(2) Array.
分析:
Name -> ID 就是 string -> int,字符串最好用 Hash 或 Tree 来索引,不过由于 Name 不是唯一的,一个 Name 可能对应多个 ID,要用 Linked List 做对应过来的结构。所以可以是 Hash + Linked List 或 Tree + Linked List。(Tree 可以用 Trie,复杂度是 O(length(name)),其实 Hash 会更好,理论上复杂度是 O(1))。
ID -> Name 就是 int(7 digit) -> string,7 位数也就是 1000 w,可以开得下(人家机子好),所以就可以随机查了。
10、数组ARR=[1,2,3,4,5],以下返回值为5的是( )
正确答案: B 你的答案: B (正确)
arr.push()arr.pop()arr.shift()arr.unshift()
分析:
push() 在数组末尾添加元素,返回新数组长度,所以返回5
pop() 删除数组最后一位,返回所删除的元素,所以返回5
shift() 删除数组第一位,返回所删除的元素,所以返回1
unshift() 在数组开头添加元素,返回新数组长度,所以返回5