整数Hash散列总结

2024-09-09 08:32
文章标签 总结 整数 hash 散列

本文主要是介绍整数Hash散列总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

方法:  

 step1  :线性探测

 step2 散列

  当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度

HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数 

const   int  MaxN = 30000 ;
bool    used[MaxN] ;struct  Hash{int  val  ;int  count ;
} ;
Hash HashTable[MaxN] ;int   searchHash(int  n){int x = n  ;while(x < 0)  x += MaxN ;while(x >= MaxN) x -= MaxN ;while(used[x] && HashTable[x].val != n){x++ ;if(x >=MaxN) x -= MaxN ;}return x ;
}void  insertTable(int n){int  id = searchHash(n) ;HashTable[id].val = n ;used[id] = 1  ;HashTable[id].count++ ;
}int   main(){int a , b , c , d , i ,  j  , ans , id ;while(scanf("%d%d%d%d" ,&a , &b ,&c ,&d) != EOF){if(a > 0 && b > 0 && c > 0 && d > 0){puts("0")  ; continue ;}if(a < 0 && b < 0 && c < 0 && d < 0){puts("0")  ; continue ;}memset(used , 0 , sizeof(used)) ;memset(HashTable , 0 , sizeof(HashTable)) ;ans = 0 ;for(i = 1 ; i <= 100 ; i++)for(j = 1 ; j <= 100 ; j++)insertTable(a*i*i + b*j*j) ;for(i = 1 ; i <= 100 ; i++){for(j = 1 ; j <= 100 ; j++){id = searchHash(- c*i*i - d*j*j) ;ans += HashTable[id].count ;}}printf("%d\n" , ans*16) ;}return 0 ;
}


POJ 1186   k1*x1^p1 + k2*x2^p2 + ...+kn*xn^pn = 0  , n <=6 ,  1 <=x <= 150 方程的个数

const int MaxN = 4000000 ;
bool  used[MaxN] ;struct Hash{int  val ;int  count ;
};
Hash HashTable[MaxN] ;int  searchHash(int n){int  x = n ;while(x < 0) x += MaxN ;while(x >= MaxN) x -= MaxN ;while(used[x] && HashTable[x].val != n){if(++x >= MaxN) x -= MaxN ;}HashTable[x].val = n ;return x ;
}void insertTable(int n){int id = searchHash(n) ;HashTable[id].count++ ;used[id] = 1 ;
}int   Pow(int x , int y){int ans = 1 ;for(; y ; y >>= 1 , x *= x){if(y&1)  ans *= x ;}return ans  ;
}int   N , M  , k[7] , p[7]  , mid , ans  ;void  GaoLeft(int id , int sum){if(id == mid){insertTable(sum) ;return ;}for(int i = 1 ; i <= M ; i++)GaoLeft(id+1 , sum + k[id] * Pow(i , p[id])) ;
}void  GaoRight(int id , int sum){if(id == N){int s = -sum ;ans += HashTable[searchHash(s)].count ;return  ;}for(int i = 1 ; i <= M ; i++)GaoRight(id+1 , sum + k[id] * Pow(i , p[id])) ;
}int  main(){int i ;scanf("%d%d" ,&N , &M) ;memset(HashTable , 0 , sizeof(HashTable)) ;for(i = 0 ; i < N ; i++) scanf("%d%d" ,&k[i] , &p[i]) ;mid = N>>1 ;ans = 0 ;GaoLeft(0 , 0) ;GaoRight(mid , 0) ;printf("%d\n" , ans) ;return 0 ;
}

zoj2672  N数,求其子数列为等差数列,且最长并输出。


struct Hash{static const int mask = 0x7fff ;int p[32768] , q[32768] ;  //做p->q的映射map<p , q>void  clear(){memset(q , -1 , sizeof(q)) ;}int & operator[] (int k){  //注意这个引用int i = k & mask ;while(q[i] != -1 && p[i] != k)  i = (i+1) & mask ;p[i] = k ;return q[i] ;}
};int  n , x[3003] ;
short dp[3003][3003] ;void  dfs(int k , int a , int b){if(k == 2){printf("%d %d" , a , b) ;return  ;}dfs(k-1 , b-a , a) ;printf(" %d" , b) ;
}int  main(){int i , j , ans  , L , R  , k  ;while(scanf("%d" ,&n) != EOF){for(i = 1 ; i <= n ; i++)  scanf("%d" ,&x[i]) ;Hash h ;h.clear() ;for(i = 1 ; i <= n ; i++)for(j = i+1 ; j <= n ; j++)dp[i][j] = 2 ;ans = 1  ;for(i = 1 ; i <= n ; i++){for(j = i+1 ; j <= n ; j++){k = h[ x[j] - x[i] ] ;if(k != -1)dp[i][j] = dp[k][i] + 1 ;if(ans < dp[i][j]){ans = dp[i][j] ;L = i ;R = j ;}}h[ x[i] ] = i ;}printf("%d\n" , ans)  ;if(ans == 1)  printf("%d\n" , x[1]) ;else{dfs(ans , x[L] , x[R]) ;puts("") ;}}return 0 ;
}

 






这篇关于整数Hash散列总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150651

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

usaco 1.2 Milking Cows(类hash表)

第一种思路被卡了时间 到第二种思路的时候就觉得第一种思路太坑爹了 代码又长又臭还超时!! 第一种思路:我不知道为什么最后一组数据会被卡 超时超了0.2s左右 大概想法是 快排加一个遍历 先将开始时间按升序排好 然后开始遍历比较 1 若 下一个开始beg[i] 小于 tem_end 则说明本组数据与上组数据是在连续的一个区间 取max( ed[i],tem_end ) 2 反之 这个

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

uva 10029 HASH + DP

题意: 给一个字典,里面有好多单词。单词可以由增加、删除、变换,变成另一个单词,问能变换的最长单词长度。 解析: HASH+dp 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter