1、STL容器;
容器类型 | 底层数据结构 | 有序/无序 | 可重复 | 其他 |
vector | 数组 | 无 | 是 | 支持快速随机访问 |
list | 双向链表 | 无 | 是 | 支持快速增删 |
deque | 双端队列 (一个中央控制+ 多个缓冲区) |
无 | 是 | 1、支持首尾快速增删 2、支持随机访问 |
stack | deque/list封闭一端开口 | 无 | 是 | |
queue | deque/list两端各封闭一个出口,入口 | 无 | 是 | |
priority_queue | vector | 无 | 是 | vector容器+heap处理 |
set | 红黑树 | 有 | 否 | |
map | 红黑树 | 有 | 否 | |
unordered_map/set | hash表 | 无 | 否 |
2、几种排序算法的比较。
排序算法 | 平均时间复杂度 | 最差时间复杂度 | 空间复杂度 | 是否稳定算法 |
冒泡排序 | O(n^2) | O(n^2) | O(1) | 是 |
选择排序 | O(n^2) | O(n^2) | O(1) | 数组不稳定 链表稳定
扫描二维码关注公众号,回复:
5315205 查看本文章
|
插入排序 | O(n^2) | O(n^2) | O(1) | 是 |
快速排序 | O(n*log2n) | O(n^2) | O(log2n) | 否 |
堆排序 | O(n*log2n) | O(n^2) | O(1) | 否 |
归并排序 | O(n*log2n) | O(n*log2n) | O(1) | 是 |
希尔排序 | O(n*(logn)^2) | O(n^2) | O(1) | 否 |
计数排序 | O(n+m) | O(n+m) | O(1) | 是 |
桶排序 | O(n) | O(n) | O(m) | 是 |
基数排序 | O(k*n) | O(n^2) | 是 |
3、散列技术与散列表。
散列技术是在纪录的存储位置与其关键字之间建立一个确定的关系f,使得每个关键字key对应一个存储位置f(key)。这里我们把这这种对应关系称为散列表或者哈希表,关键字对应的纪录存储位置称为散列地址。查找关键字时,根据f计算key对应的位置,若查找集合中存在这个纪录,则必定在f(key)这个位置上。将散列技术将纪录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或者哈希表。
1、直接定址法。
2、除留余数法。
f(key)=key mod p(p<=m)
3、开放定址法。
1>fi(key)=(f(key)+di) MOD m(di=1,2,3,...,m-1);
2>fi(key)=(f(key)+di) MOD M,(di=1,-1,4,-4,...);
3>fi(key)=(f(key)+di) MOD M,(di是一个随机数值);
4、链地址法。
一种实现:
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
typedef struct _node
{
char *name;
char *desc;
struct _node *next;
} node;
#define HASHSIZE 101
static node* hashtab[HASHSIZE];
void inithashtab()
{
int i;
for(i=0; i < HASHSIZE; i++)
hashtab[i]=NULL;
}
unsigned int hash(char *s)
{
unsigned int h=0;
for(; *s; s++)
h=*s+h*31;
return h%HASHSIZE;
}
node* lookup(char *n)
{
unsigned int hi=hash(n);
node* np=hashtab[hi];
for(; np!=NULL; np=np->next)
{
if(!strcmp(np->name,n))
return np;
}
return NULL;
}
char* m_strdup(char *o)
{
int l=strlen(o)+1;
char *ns=(char*)malloc(l*sizeof(char));
strcpy(ns,o);
if(ns==NULL)
return NULL;
else
return ns;
}
char* get(char* name)
{
node* n=lookup(name);
if(n==NULL)
return NULL;
else
return n->desc;
}
int install(char* name,char* desc)
{
unsigned int hi;
node* np;
if((np=lookup(name))==NULL)
{
hi=hash(name);
np=(node*)malloc(sizeof(node));
if(np==NULL)
return 0;
np->name=m_strdup(name);
if(np->name==NULL) return 0;
np->next=hashtab[hi];
hashtab[hi]=np;
}
else
free(np->desc);
np->desc=m_strdup(desc);
if(np->desc==NULL) return 0;
return 1;
}
/* A pretty useless but good debugging function,
which simply displays the hashtable in (key.value) pairs
*/
void displaytable()
{
int i;
node *t;
for(i=0; i < HASHSIZE; i++)
{
if(hashtab[i]==NULL)
printf("()");
else
{
t=hashtab[i];
printf("(");
for(; t!=NULL; t=t->next)
printf("(%s.%s) ",t->name,t->desc);
printf(".)");
}
}
}
void cleanup()
{
int i;
node *np,*t;
for(i=0; i < HASHSIZE; i++)
{
if(hashtab[i]!=NULL)
{
np=hashtab[i];
while(np!=NULL)
{
t=np->next;
free(np->name);
free(np->desc);
free(np);
np=t;
}
}
}
}
main()
{
int i;
char* names[]= {"name","address","phone","k101","k110"};
char* descs[]= {"Sourav","Sinagor","26300788","Value1","Value2"};
inithashtab();
for(i=0; i < 5; i++)
install(names[i],descs[i]);
printf("Done");
printf("If we didnt do anything wrong..""we should see %s\n",get("k110"));
install("phone","9433120451");
printf("Again if we go right, we have %s and %s",get("k101"),get("phone"));
/*displaytable();*/
cleanup();
return 0;
}