zoukankan      html  css  js  c++  java
  • 散列

    数据处理中数据匹配常用到Qmap和QHash。

    QHash查找速度上显著于QMap

    QHash以任意的方式进行存储,而QMap则是以key顺序进行存储。

    散列表的实现常叫做散列(hashing),以常数平均时间插入、删除、查找。

    散列原理:当输入一个关键字后,根据散列函数将其散列到表中一个位置,当位置冲突时,在该位置形成一个链表(分离链接法);

    散列实现:关键字%表的大小;

    注意事项:表的大小一般应为素数,才能保证关键字尽量分散。(prime number:m不能被2 ~ √m 整除)

    当关键字是数字时,直接与表的容量求余即可;

    当关键字为字符串时,将其ASCII码值求和再与表的容量求余。但当表容量很大,而关键字很小时,就不能表尽其用。

    一种可行的hashing实现方法如下:

    int hash (const char *key , int tableSize)
    {
         unsigned int hashVal = 0;
         while(*key != '')
         hashVal = (hashVal << 5) + *key++;
         return hashVal % tableSize;
    }

    解决冲突问题(分离链接法):

    声明:

    struct listNode
    {
           elementType  element;
           listNode     *next;
    }
    typedef listNode node;
    struct hashTable
    {
           int   tableSize;
           node  *theLists;   //theLists是数组,存放指向listNode结构指针  node*
    }

    分离链接散列表初始化:

    hashTable initializeTable(int tableSize)  //tableSize为数据总量
    {
            hashTable  *H;
            if(tableSize < minTableSize)
            {
                  cout << "table size is too small" << endl;
                  return NULL;
            }
            H = (hashTable*) New hashTable;
            if(H == NULL)
                 cout << "out of space" << endl;
            H->tableSize = nextPrime(tableSize); //大于数据总量tableSize的最小素数设置为链表大小
    
            H->theLists = (node*)New node[H->tableSize];
            if(H->theLists == NULL)
                 cout << "out of space"<< endl; 
            for(long i = 0; i < tableSize; i++)   //设置表头
                 H->theLists[i]->next = NULL;
           
            return H;
    }

    分离链接散列表find:

    node* find(elementType key , hashTable *H)
    {
            node *P;
            node *L;
            L = H->theLists[hash(key , H->tableSize)];
            P = L->next;
            while(P != NULL && P->element != key)     //未找到就返回NULL
                     P = P->next;
            return P;
    }

    如elementType为字符串,则使用strcmp(str1 , str2),当s1== s2时,返回值= 0。

    while(p !=NULL && (! strcmp(key , H->tableSize))) 
          p = p->next;

    分离链接散列表insert:(类似链表插入,前端插入方便就在前端插入)

    void insert (elementType key , hashTable *H)
    {
           node *tem , *newCell , *L;
           //判断key是否在散列表中,若在,不操作;若不在,则前端插入
           tem = find(key , H);      //tem == NULL,未找到key
           if(tem == NULL)
           {
               newCell = (node *)New node;
               if(newCell == NULL)
               {
                   cout << "out of space" << endl;
                   return NULL;
               }
               else
               {
                     L = H->theLists[hash(key , H->tableSize)];
                     newCell->element = key;
                     newCell->next = L->next;
                     L->next = newCell;
               }
           }      
    }
  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/Lunais/p/5576115.html
Copyright © 2011-2022 走看看