读书笔记
排序
排序函数
C语言
void qsort (void* base, size_t num, size_t size,int (compar)(const void,const void*)
base:待排序的数组首地址
num:数组中待排序元素数量
size:数组元素专用空间大小
compar:排序函数的指针
(这个函数我第一次听说(+_+)?,我太弱了)
C++
void sort Iterator first, Iterator last)
void sort (Iterator first, Iterator last, Compare comp)
first 首迭代器
last 尾迭代器
comp 比较函数
排序的信息存储
一般排序题会给出很多信息,比如学生姓名,分数,排名等信息,为了方便编写代码,常常将它们存储在一个结构体里。例
struct Stu{
char name[10];
int score;
int rating;
}stu[10000];
比较函数的编写: 按题目意思来
排名的实现
分数不同的排名不同,分数相同的排名相同但占用同一个排位,例如学生成绩为
90 88 88 88 86
1 2 2 2 5
stu[0].rating = 1;
for(int i=1;i<n;i++){
if(stu[i].score == stu[i-1].score){
stu[i].r = stu[i-1].r;
}else{
stu[i].r = i+1; //这个地方我有点不懂,等做到这种题再跟新
}
}
散列
散列定义
将元素通过一个函数转换成整数,使得该整数可以尽量唯一地代表这个元素。称这个函数为散列函数
key -> hash(key)
常见的散列函数
①直接定址法
②平方取中法
.平方后去中间位数
③除留余数法
碰撞
如果
但是
,则发生了碰撞,解决方法:
①线性探查法
②平方查找法
③链地址法
应用:
①直接定址法
给出N个正整数,再给出M个正整数。问M个数中每个数是否在N个数中出现过?
创建一个数组hashtable[100001],将hashtable[N]=true,其他为false。对于M个正整数,直接查找对应的下标的值是不是true即可
const int max = 100001;
bool hashtable[max]={false};
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&x);
hashtable[x]=true;
}
for(int i=0;i<m;i++){
scanf("%d",&x);
if(hashtable[x] ==true)
printf("YAS");
else
printf("No");
}
return 0;
}
字符串hash
字符串由很多字符组成,怎么映射到整数呢?
通过把A~Z看出0~25。这样就可以把字符串映射成为26进制数,再通过26进制转换成10进制即可。转换后的数
,可能很大,用long long
int hash(char s[],int len){
int id=0;
for(int i=0;i<len;i++){
id=id*26+(s[i]-'A');
}
return id;
}
如果有小写,则把a~z看成26~51.转换后的数
int hash(char s[],int len){
int id=0;
for(int i=0;i<len;i++){
if(s[i]>='A' && s[i]<='Z')
id=id*52+(s[i]-'A');
else if(s[i] >='a' && s[i]<='z')
id=id*52+(s[i]-'a')+26;
}
}