哈希函数的特性:
- 哈希函数的输入是无穷的
- 哈希函数的输出是有限的
- 哈希函数对于同一个数据,返回的结果是一样的,不是随机的
- 由于输入是无穷的,输出是有限的,则必然多个输入会对应同一个输出
- 哈希函数的返回具有离散型,对于很多个不同的输入,一定会出现相同的输出,相同的输出具有均匀分布的特点 (加入输入是(0,99),输出是(0,1),那么输出的 0 1 会均匀分布)
- 补充:哈希函数有很多种,内部的结构很复杂,假如我们需要一千种不同的哈希,我们是不是要找一千种哈希函数,其实不需要,我么可以根据一个哈希函数得到我们想要的一千种结果。假如哈希函数返回一个16位的16进制的数,我们可以分为 H1 = 高八位,H2 = 低八位 H(新) = H1 + bH2 ,b的值可以所以改变,现在得到的新的哈希值和原来的哈希值不具备正向相关。
实力不够,以后接着写
。。。。。。。。。。。。。。。。。。。。。。。。。
求最大连续子串的和:一个循环,如果求到某个值是个负数,则舍弃前面的数。
#include<iostream> using namespace std; int main() { int a, b[100]; //a代表输入数字的长度 b用来接收数字 cin >> a; for (int i = 0; i < a; i++) { cin >> b[i]; } int item = -99999, thissum = 0; for (int i = 0; i < a; i++) { thissum += b[i]; if (thissum < 0) { thissum = 0; } if (thissum > item) { item = thissum; } } cout << "最长子序列:" << item<<endl; return 0; }
最小和问题:一个数字数组,下标为0的数如果比下标为1的数小,则下标为0的数是最小和,下标为最后一个数的数比下标为最后一个数的前一个数的数小,则下标为最后一个数的数是最小和,其次下标不是最后和最前的数必须比他两端的数还要小才是最小和,给出一个这样的数组,求出任意一个最小和,我们可以使用二分来做这个题
#include<iostream> using namespace std; int main() { int a, b[100]; //a表示这个数字数组的的长度,b用来存贮这组数字,这些数字不会重复 cin >> a; for (int i = 0; i < a; i++) { cin >> b[i]; } int lef = 0; int rit = a - 1; int min,mid; if (b[lef] < b[lef + 1]) { min = b[lef]; } else if (b[rit] < b[rit - 1]) { min = b[rit]; } else { while (lef < rit) { mid = lef + ((rit - lef) >> 1); if (b[mid] < b[mid + 1] && b[mid] < b[mid - 1]) { min = b[mid]; break; } else if (b[mid] > b[mid + 1]) { lef = mid; } else { rit = mid; } } } cout << "最小和:" << min << endl; return 0; }