您的位置:首页 > 其它

[算法总结] 基础算法技巧总结

2018-02-02 09:28 169 查看
排序

散列

二分

排序

1. 使用结构体

在比较类题目中,往往会给出多项信息,可以用结构体进行组织,用于排序的因素都需要出现在结构体中,用于构造sort函数中的cmp多级排序

//按分数降序排序,当分数相同时,按学号升序排序
struct stu{
int id;
int score;
};

bool cmp(stu a,stu b){
if(a.score != b.score){
return a.score > b.score;
}else{
return a.id < b.id
}
}


注意: cmp中的符号问题。如果按升序排列
前 < 后
,如果是降序
前 > 后


2. 名次的输出方法

直接输出

将名次保存在结构体中

//按分数高低排名次
int rank = 1;
for(int i = 0;i < n;i++){
if(i > 0 && a[i].score != a[i-1].score){
rank = i+1;
}
printf(...)
}


注意:二维字符数粗对n个字符串按一定顺序排序无法使用sort(比如字典序排序char arr[3] = {“abc”,”adc”,”acd”}),可以使用string数组代替

散列

散列法的本质是直接把数据当作数组下标使用,有如下几种方式:

数字或者字符散列

直接把数字或者字符当作数组下标使用,是一种典型的以空间换时间的方法。一般取该数字可能的最大上限为散列数组的大小,取128(ASSII码)为字符散列数组的上线。在数组中,可以以0,1起flag的作用,也可以记录次数。查询时的代价为O(1)。散列数组无法体现出数据的先后性,需要辅助数组

字符串散列

首先需要将字符串通过Hash函数转化为整数:

//字符串仅有大写字母
int hashFun1(char s[]){
int len = strlen(s);
int id = 0;
for(int i = 0;i < len;i++){
id = id*26 + (s[i]-'A');
}
return id;
}

//字符串有大小写
int hashFun2(char s[]){
int len = strlen(s);
int id = 0;
for(int i = 0;i < len;i++){
if(s[i] <= 'Z' && s[i] >='A'){
id = id*52 + (s[i]-'A');
}else{
id = id*52 + (s[i]-'a')+26;3
}
}
}

int main(){
char s[] = "WUJIAJ";

printf("%d\n",hashFun1(s));

}


二分

#include<cstdio>

//查找x的位置,如果不存在返回-1 (序列中是否有满足某个条件的数)
//左右边界是0或者1或者其他数不影响算法进行
//减序如何处理
int binarySearch(int a[],int left,int right,int x){
while(left <= right){
//int mid = (left+right)/2;
int mid = left + (right-left)/2;//等效写法,避免mid有可能出现的溢出
if(x > a[mid]) left = mid + 1;
else if(x < a[mid]) right = mid -1;
else return mid;
}
return -1;
}

//查找第一个大于等于x的位置(假设序列中x存在,x应该在的位置)
int lowerBound(int a[],int left,int right,int x){ //上界是n,不是n-1
while(left < right){ //不是小于等于
int mid = (left+right)/2;
if(a[mid] >= x) right = mid;
else left = mid+1;
}
return left;
}

//查找序列第一个大于x的位置
int upperBound(int a[],int left,int right,int x){
while(left < right){
int mid = (left + right)/2;
if(a[mid] > x) right = mid;
else left = mid+1;
}
}

//共性:寻找有限序列中第一个满足某个条件的元素
//从左到右先不满足,再满足
//模板:区间[left,right],初值要能覆盖所有可能取值(注意上界)
int muban(int left,int right){
int mid;
while(left < mid){
mid
4000
= (left+right) / 2;
if("条件成立"){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM