算法06

哈希函数的特性:

  • 哈希函数的输入是无穷的
  • 哈希函数的输出是有限的
  • 哈希函数对于同一个数据,返回的结果是一样的,不是随机的
  • 由于输入是无穷的,输出是有限的,则必然多个输入会对应同一个输出
  • 哈希函数的返回具有离散型,对于很多个不同的输入,一定会出现相同的输出,相同的输出具有均匀分布的特点 (加入输入是(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;

}
View Code

 最小和问题:一个数字数组,下标为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;
}
View Code

 

posted @ 2018-09-13 19:56  清浅...忆回  阅读(98)  评论(0编辑  收藏  举报