zoukankan      html  css  js  c++  java
  • 7-43 字符串关键字的散列映射 (25分)--散列,平方探测法

     1 #include <iostream>
     2 #include <string>
     3 #include <cstring>
     4 using namespace std;
     5 int main()
     6 {
     7     char a[501][10];//存储字符串
     8     int pos[501];//字符串存放的位置
     9     int exist[1100];//用来标志表中某个位置是否被占用,数组要开大,P是>=N的最小素数
    10     int N, P;
    11     cin >> N >> P;
    12     for (int i = 0; i < P; i++)exist[i] = -1;//没有被占用时设为-1
    13     for (int i = 0; i < N; i++)
    14     {
    15         cin >> a[i];
    16         int flag = 0;
    17         for (int c = 0; c < i; c++)
    18         {
    19             if (!strcmp(a[i], a[c]))//检测是否有重复的关键字
    20             {
    21                 pos[i] = pos[c];
    22                 flag = 1;
    23                 break;
    24             }
    25         }
    26         if (flag == 0)//如果没有重复的关键字
    27         {
    28             int k = -1;
    29             while (a[i][++k] != '');
    30             if (k < 3)//判断字符是否小于三个
    31             {
    32                 if (k == 2)k -= 2;
    33                 else if (k == 1)k -= 1;
    34             }
    35             else
    36             {
    37                 k -= 3;
    38             }
    39             unsigned long int hash_value = 0;//开始散列
    40             while (a[i][k] != '')
    41             {
    42                 hash_value = (hash_value << 5) + (int)(a[i][k++] - 'A');
    43             }
    44             int x = hash_value % P;
    45             int tempx = x;
    46             int j = 1;
    47             while (exist[x] != -1)//平方探测法处理冲突
    48             {
    49                 x = tempx;
    50                 x = (x + j * j);
    51                 while (x >= P)x -= P;
    52                 if (exist[x] != -1)
    53                 {
    54                     x = tempx;
    55                     x = (x - j * j);
    56                     while (x < 0)x += P;
    57                 }
    58                 j++;
    59             }
    60             pos[i] = x;
    61             exist[x] = 1;
    62         }
    63     }
    64     for (int i = 0; i < N; i++)
    65     {
    66         cout << pos[i];
    67         if (i != N - 1)cout << ' ';
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    vmware安装后设置网络
    博客园添加视频
    博客园音乐插件
    去除数组空格 php
    Jmeter 中多线程并发和循环控制器
    Jmeter对返回体中Json格式的reponse的处理
    Jmeter 抓app包 抓到一半不好用了
    Jmeter ResponseAssertion 【Ignore Status】
    JMeter源码导入到Intellij IDEA
    Jmeter 处理Unicode编码转为中文
  • 原文地址:https://www.cnblogs.com/2020R/p/12792883.html
Copyright © 2011-2022 走看看