算法笔记 --第四章 入门篇(2) 算法初步

这里写图片描述

读书笔记

排序

排序函数

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)




常见的散列函数

①直接定址法
h a s h ( k e y ) = a k e y + b
②平方取中法
h a s h ( k e y ) = ( k e y k e y / 1000 ) % 1000000 .平方后去中间位数
③除留余数法
h a s h ( k e y ) = k e y % m o d

碰撞

如果 k e y 1 ! = k e y 2 但是 h a s h ( k e y 1 ) == h a s h ( k e y 2 ) ,则发生了碰撞,解决方法:
①线性探查法
②平方查找法
③链地址法

应用:

①直接定址法
给出N个正整数,再给出M个正整数。问M个数中每个数是否在N个数中出现过? M . N < 10 5
创建一个数组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进制即可。转换后的数 < 26 l e n 1 ,可能很大,用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.转换后的数 < 52 l e n 1

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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/81183899