共四道道
1. 簡述線性表 二叉平衡樹 哈希表存儲數據時的優劣
線性表分爲順序存儲結構和鏈式存儲結構
順序存儲結構優點是可以實現隨機讀取,時間複雜度爲O(1),空間利用率高;缺點是進行插入和刪除操作時比較麻煩,時間複雜度爲O(n),同時容量受限制,需要事先確定容量大小,容量過大浪費空間資源,過小不能滿足使用要求,會產生溢出問題。鏈式存儲結構優點,插入和刪除非常簡單,前提條件是知道操作位置,時間複雜度是O(1),但如果不知道操作位置則要定位元素,時間複雜度也是O(n),還有一個很大的優點是沒有容量的限制,可以在使用過程中動態的分配內存空間,不用擔心溢出的問題;缺點是它不能實現隨機讀取,同時空間利用率不高
二叉平衡樹O(log n)時間內做查找,插入和刪除,空間複雜度O(n)
哈希表O(1)時間內做查找,插入和刪除,空間複雜度O(n)。
2.簡答:一個十進制數m轉化N進制,N屬於[1, 16]。
void transfer(int m,int N)
{
int aa[20],i,saveM=m;
for(i=0;m!=0;i++)
{
aa[i]=m% N;
m=m/ N;
}
printf("十進制數%d的%d進制形式是:\n",saveM, N);
for(;i!=0;i--)
printf("%d",aa[i-1]);
3.讀程序
#include<iostream>
using namespace std;
int var_1=0;
char *pvar_1=NULL;
int main()
{
intvar_2;
charstr[]="abe";
char*p="efs";
int*kk=vector<int>;
kk=new *int;
p=(char *)malloc(20);
if(p==NULL)
printf("dfdf");
if(kk==NULL)
pritnf("ddfdsfds");
if(kk!=NULL)
free(kk);
if(p!=NULL)
delete p;
} 1.c程序存儲分類;
2.var_1 var_2 str p kk "efs""abe"分別存儲在什麼地方
var_1 :全局變量區var_2:棧str :棧p:堆 kk:堆"efs" ,"abe":文字常量區
3.p分配失敗程序會怎樣
輸出dfdf
4. free (kk) delete p;有什麼不妥,兩種釋放方式異同點?
可能內存泄露,應該是delete []kk ,free (p); free釋放內存,但對象依然存在,delete自動析構。
四。系統設計題(40分)
對於一個遞增數組,我們可以採用二分查找法判斷數組是否存在數x。但現在有一不太規則的數組A’,但它又具備一定的規則性:在某一範圍是遞增,如數組序列:{15,16,17,21,1,4,6,7,100,124,156,…},在前4項是遞增的,第5項到第9項也是…在這樣的數組中,如何查找數x是否存在了。請詳細給出你的算法。並分析算法的時間複雜度和空間複雜度。
本程序分爲兩個部分,循環數組採用特殊二分搜索,單調遞增採用普通二分法。
//本程序由深大小雨所編,其功能是在循環數組裏找x是否存在,這裏我理解的循環只是兩段如:7 8 9 10 1 2 5
//本算法思想是基於這樣的一個事實:順序遞增可用二分快速查找,將上述的數組裏砍成兩半
//必得一個是順序遞增,另一個仍是循環遞增(子問題)2011-10-11
#include<stdio.h>
int time; //記錄查找次數,方便驗證其時間是否爲logN
//bfind()即二分查找x,找到即返回1
int bfind(int *A,int low,int high,int x)
{
int mid;
int flag=0;
if(A[low]==x||A[high]==x)
{ flag=1;
return flag;
}
while(low<=high)
{ mid=(low+high)/2;
if(x==A[mid])
{
flag=1;
printf("the %dth to find\n",++time);
break;
}
//到x屬於其範圍的段裏找
else if(x>A[mid])
{
printf("the %dth to find\n",++time);
low=mid+1;}
else if(x<A[mid]){
printf("the %dth to find\n",++time);
high=mid-1;}
}
return flag; //找到返回1
}
//循環數組裏的二分查找:其功能是將一數組砍成兩段,若x在順序遞增裏,即直接二分查找
//否則問題縮小爲在新的循環數組裏找x(子問題)
void find(int *A,int low,int high,int x)
{
int mid=(low+high)/2;
if(low>high)
{ printf("the %dth to find\n",++time);
printf("no the elem\n");
return;
}
else
{
printf("the %dth to find\n",++time);
if(A[mid]>=A[low]) //前半部分遞增
{
if((x>=A[low])&&(x<=A[mid])) //要找的元素x大小符合遞數組範圍
{
if(bfind(A,low,mid,x)==1) //調用找,找到返回1
printf("the %d is found\n",x);
else
printf("no the elem\n");
}
else //要找的x大小仍在循環數組範圍裏,認爲這是子問題
find(A,mid+1,high,x); //遞歸調用
}
else if(A[mid]<=A[high]) //後半部分遞增
{
if((x<=A[high])&&(x>=A[mid])) //要找的元素x大小符合遞增數組範圍
{
if(bfind(A, mid,high,x)==1) //調用二分查找,找到返回1
printf("the %d is found\n",x);
else
printf("no the elem\n");
}
else //要找的x大小仍在循環數組範圍裏,認爲這是子問題
find(A,low,mid-1,x); //遞歸調用
}
}
}
void main()
{
int num[32]={15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int e;
while(1){
scanf("%d",&e);
time=0;
find(num,0,31,e);
}
}
參考http://topic.csdn.net/u/20111009/14/bba5d32a-9216-4884-bcfc-5c83478eb5aa.html