1.hash表,便于插入和查找
hash函数的构造方法:直接定址法、数字分析法、平方取中法、折叠法、除留余数法
处理冲突的方法:开放地址法、再哈希法、链地址法
2.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)
3.用链表表示线性表的优点是(便于插入和删除操作)
4.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表)
5.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构)
6下列数据结构具有记忆功能的是(栈);递归算法一般需要利用(队列)实现。
7.在一个容量为25的循环队列中,若头指针front=16,尾指针rear=9,则该循环队列中共有 18 个元素。注:当rear<front时,元素个数=总容量-(front-rear); 当rear>front时,元素个数=rear-front。
8.判断两个数组中是否存在相同的数字 给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字?
O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。
bool findcommon2(int a[], int size1, int b[], int size2) {
int i=0,j=0;
while(i<size1 && j<size2){
if(a[i]==b[j])
return true;
if(a[i]>b[j])
j++;
if(a[i]<b[j])
i++;
}
return false;
}
9.最大子序列 问题: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大?
给出一个算法复杂度为O(n)的线性算法实现,这里运用动态规划的思想。
int max_sub2(int a[], int size) {
int i,max=0,temp_sum=0;
for(i=0;i<size;i++){
temp_sum+=a[i];
if(temp_sum>max)
max=temp_sum;
else if(temp_sum<0)
temp_sum=0; //之前的数据都可以放弃
}
return max;
}