知识点笔记:哈希存储:字符串存储、数字存储

文章目录

  • 1 遍历
  • 2 二分
    • 模板
    • 1044(25:连续子序列和)
  • 3 hash
    • 3.1 数字存储
      • 1121(25)
    • 3.2 字符串存储
      • 模板

1 遍历

2 二分

模板

// 相等
int find_equ(int low, int high, int a[], int key){int mid;while(low<high){mid = (low+high)/2;if(a[mid] == key){return mid;       //mid}else if(key < a[mid]){  //左边找high = mid-1;}else{low = mid+1;}}return -1;
}// 第一个>=(升序)
int find_lower_bound(int low, int high, int a[], int key){int mid;while(low<high){mid = (low+high)/2;if(a[mid] >= key){  //因为a[mid]>=key,所以右边均>=key。第一个>=key的位置,在左边找[low, mid],可能在mid位置=,所以high不能为mid-1high = mid;}else{low = mid+1;   }}if(a[low]>=key) return low;       //low=highelse return -1;
}// >
int find_lower(int low, int high, int a[], int key){int mid;while(low<high){mid = (low+high)/2;if(a[mid] > key){  // 左边找[low, mid], 可能在mid位置第一个>,所以high不能为mid-1high = mid;}else{low = mid+1;   }}if(a[low]>key) return low;     //low=highelse return -1;
}int arr[3] = {5, 10, 15};
//  >=
int *p, index;
p = lower_bound(arr, arr+3, 20);      //不存在,返回假设存在arr[i]>=20应该在的位置,即index=3
index = p-arr;
int k = find_lower_bound(0,2,arr, 10); //k=1
// >
p = upper_bound(arr, arr+3,15);           //不存在,返回假设存在arr[i]>15的位置,即index=3
index = p-arr;
k = find_lower(0,2,arr,10);        // k=2

1044(25:连续子序列和)

(1)题目
求所有连续子序列和>=k的子序列

(2)代码

#include<cstdio>
#include<vector>
#include<algorithm>using namespace std;const int N = 1e+5+10;
const int INF=0x3f3f3f3f;typedef struct Node{int start;int end;
}Node;// >=
int find_lower_bound(int low, int high, int a[], int key){int i=low;int mid;while(low<high){mid = (low+high)/2;if(a[mid]-a[i-1] >= key){high = mid;}else{low = mid+1;  }}return low;  //low=high
}bool cmp(Node no1, Node no2){return no1.start < no2.start;
}vector<int> vect;
int sum[N]={0};        //sum[i]:vect[1] 到 vect[i]的和int main(){//freopen("in.txt", "r",stdin);int n,m;scanf("%d%d", &n, &m);vect.resize(n+1);for(int i=1; i<=n; i++){scanf("%d", &vect[i]);sum[i] = sum[i-1] + vect[i];}int tempSum,j;int minSum=INF;vector<Node> vect2;Node node;for(int i=1; i<vect.size(); i++){j = find_lower_bound(i,vect.size()-1,sum,m);  //第一个sum[j]-sum[i-1]>=m的j:即vect[i] +...+ vect[j]>=mtempSum = sum[j] - sum[i-1];if(tempSum < minSum && tempSum>=m){vect2.clear();node.start = i;node.end = j;vect2.push_back(node);minSum = tempSum;}else if(tempSum == minSum && tempSum>=m){node.start = i;node.end = j;vect2.push_back(node);}}sort(vect2.begin(), vect2.end(), cmp);for(int i=0; i<vect2.size(); i++){printf("%d-%d\n", vect2[i].start, vect2[i].end);}//fclose(stdin);return 0;
}

(3)小结

  • 连续子序列和,设置sum[N]
  • 当外层循环为10^5时,内层查找用二分,不能用遍历(超时)

3 hash

3.1 数字存储

1121(25)

题目:

(2)代码

#include<cstdio>
#include<vector>
#include<algorithm>using namespace std;const int ID_MAX = 100000+10;
const int N = 50000+10;int couple[ID_MAX];  //couple[i]=j,i和j是一对couples
bool party[ID_MAX];   //party[i]:id=i   party[i]=true:出席了party
vector<int> alone;  //第1种没有couple,第2种自己的couple没出席int main()
{//freopen("in.txt", "r", stdin);fill(couple,couple+N, -1);int n;scanf("%d", &n);for(int i=0; i<n; i++){int a, b;scanf("%d%d", &a,&b);couple[a] = b;couple[b] = a;}int m;scanf("%d", &m);for(int i=0; i<m; i++){int g;scanf("%d", &g);party[g]=true;}for(int i=0; i<ID_MAX; i++){if(party[i]){int j=couple[i];if(j==-1){      //没有couplealone.push_back(i);}else if(!party[j]){    //自己的couple没出席alone.push_back(i);}}}sort(alone.begin(), alone.end());printf("%d\n",alone.size());for(int i=0; i<alone.size(); i++){if(i!=0){printf(" ");}printf("%05d", alone[i]);}//fclose(stdin);return 0;
}

(3)小结

  • 一对数字:a[i] = j(i和j是一对)
  • 有时可用set,有时用hash更方便
    如:bool party[ID_MAX]或int party[ID_MAX]

3.2 字符串存储

模板

  • map<int, string> 和 map<string, int>(不同的字符串数<1000)
  • 进制转换 + 直接定址法()
    (进制转换:哈希存储:字符串存储、数字存储

PAT之查找:遍历、二分、hash相关推荐

  1. C语言白话数组数据查找(遍历查找、二分查找)

    C语言白话数组数据查找 遍历查找 二分查找 普通方式 递归法 遍历查找 方法和名字一样就是逐个循环去查找数据,然后进行比较获得我们所需要的值. #include<stdio.h> main ...

  2. 【Java】 查找数组中指定元素之 顺序查找 与 二分查找

    今天博主分享两个查找数组中指定元素的算法:顺序查找与二分查找 小小目录 1.顺序查找 2. 二分查找 1.顺序查找 给定一个数组, 再给定一个元素, 找出该元素在数组中的位置. 代码如下: //顺序查 ...

  3. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

  4. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

  5. java数组线性查找_数组查找: 线性查找与二分查找

    前言 从数组中查找你需要的数据,是一个很常见的需求,那么当你查找所需数据时,用什么方法查找速度最快? 本文将通过图文形式,详细讲解线性查找与二分查找,并用JavaScript将其实现,欢迎各位感兴趣的 ...

  6. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例

    介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...

  7. 编程艺术第二十三 四章 十一续 杨氏矩阵查找 倒排索引关键词Hash编码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第二十三 ...

  8. Python数据结构与算法篇(五)-- 二分查找与二分答案

    1 二分法介绍 1.1 定义 二分查找又称折半查找.二分搜索.折半搜索等,是一种在静态查找表中查找特定元素的算法. 所谓静态查找表,即只能对表内的元素做查找和读取操作,不允许插入或删除元素. 使用二分 ...

  9. 折半查找(二分查找)

    折半查找(二分查找) 1.折半查找法,也称为二分查找法, 二分搜索, 是一种在有序数组中查找某一特定元素的搜索算法.搜索过程中从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束: ...

  10. 让你秒懂的折半查找(二分查找)

    折半查找又称二分查找,只能适用于有序的顺序表. //折半查找 int Bsearch(int R[],int low,int high,int key){int min;while(low<=h ...

最新文章

  1. Machine Learning Algorithm
  2. 维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD)、去中心化交易所Wayki-DEX、去中心化合成资产协议Wayki-X
  3. 6月27日比特币现金消息总结
  4. 算法----返回Excel相应的列序号
  5. python读取excel表格-Python读取Excel单元格的内容
  6. ​年底大会火爆,看“瑶台”如何搭建一场高质量沉浸式大会
  7. addeventlistener不支持ajax_十万个Web前端面试题之AJAX、axios、fetch的区别
  8. Java黑皮书课后题第10章:10.21(被5或6整除)找出能被5或6整除的大于Long.MAX_VALUE的前10个数字
  9. Web前端笔记(3)
  10. [Android学习笔记]startActivityForResult和onActivityResult的使用
  11. redis依赖包_解决痛点:二方包稳定性测试实践
  12. java 链式写法_JAVA中实现链式操作(方法链)的简单例子
  13. 利用HTML完成登陆界面设计
  14. 【Linux】Debian 连接惠普打印机并共享
  15. Android FFMpeg 播放器
  16. 如何用Redis统计UV(独立访客)
  17. Android面试英文介绍
  18. 次奥,搞定奇怪bug
  19. 电子类研究生的STM32小白入门 一个定时器 四个channel复用映射 实现超声波四路测距
  20. 若依分离版整合IJpay实现第三方支付-(微信支付篇_v2)

热门文章

  1. iBatis.Net系列(五)-providers.config-
  2. 《CLR Via C# 第3版》笔记之(八) - 类型的转换构造器和方法
  3. WCF分布式安全开发实践(10):消息安全模式之自定义用户名密码:Message_UserNamePassword_WSHttpBinding...
  4. python float转int_Python 常见内置数据类型及其转换方法
  5. 简述osi参考模型各层主要功能_简述OSI参考模型及各层的功能
  6. python求偏度系数_python pandas库和stats库计算偏度和峰度(附程序)
  7. 软件测试时间特性,软件测试-第九章调试特性
  8. python 数据去重 max()_荐 用 Python 对 Excel 表格内数据进行去重、分类,标记异常及分析...
  9. java服务端开发 php_Java和 PHP哪种语言更适合直播系统后台开发
  10. 【转】C# SqlServer操作辅助类(SqlServerHelper.cs)