zoukankan      html  css  js  c++  java
  • 算法导论第11章散列表11.1直接寻址表

    一种动态集合结构,只支持,插入,查找,删除三种操作。

    直接寻址:

    在空间允许的情况下,提供一个数组为每个可能的关键字保留一个位置。

    首先直接寻址技术不是散列表的一种,它是类似数组的一种数据结构,第11章,名字叫散列表三个字对应Hash Tables

    散列表比直接存储的好处是,节省空间

    UVC1L{$2`]EOI@8QX)ILUJK

    H4_L(F1_8RWPP(NS{O3LB{U

    /*
     * IA_11.1DirectAddressTables.cpp
     *
     *  Created on: Feb 11, 2015
     *      Author: sunyj
     */
    #include <stdint.h>
    #include <iostream>
    #include <string.h>
    // DIRECT-ADDRESS-SEARCH(T, k)
    // return T[k]
    
    // DIRECT-ADDRESS-INSERT(T, x)
    // T[x.key] = x
    
    // DIRECT-ADDRESS-DELETE(T, x)
    // T[x.kdy] = NIL
    
    template <class Type> class ElemType {
    public:
        ElemType() : key(0), data('') { }
        ElemType(int64_t const k, Type const d) : key(k), data(d) { }
    
        int64_t key; // key belongs to a small range like [0, 1, 2, 7, 99.... ]
        Type data;
    };
    
    template <class Type> class DirectAddressTable {
    public:
        DirectAddressTable(int64_t const n) : size(n)
        {
            data = new ElemType<Type>[n];
            memset(data, -1, n * sizeof(ElemType<char>));
        }
        ~DirectAddressTable() { delete [] data; }
        ElemType<Type> search(int64_t const key)
        {
            if (-1 == data[key].key)
            {
                std::cout << "not found search failed" << std::endl;
            }
            return data[key];
        }
        void insert(ElemType<Type> x)
        {
            if (-1 != data[x.key].key)
            {
                std::cout << "x.key already exist, insert failed" << std::endl;
                return ;
            }
            data[x.key] = x;
        }
        void del(ElemType<Type> x)
        {
            if (-1 == data[x.key].key)
            {
                std::cout << "x.key not exist, delete failed" << std::endl;
                return ;
            }
            data[x.key].key = -1;
        }
    private:
        ElemType<Type>* data;
        int64_t size;
    };
    
    int main()
    {
        ElemType<char> a(2, 'b');
        ElemType<char> q(3, '8');
        ElemType<char> c(22, 'q');
        ElemType<char> w(9, 'N');
    
        // Assume there are at most 100 ElemType element,
    
        DirectAddressTable<char> table(100);
        table.insert(a);
        table.insert(q);
        table.insert(c);
        ElemType<char> tmp;
        tmp.key = 3;
        tmp = table.search(tmp.key);
        std::cout << tmp.data << std::endl;
        tmp.key = 4;
        tmp = table.search(tmp.key);
        std::cout << tmp.data << std::endl;
    
        table.insert(a); // insert failed
        table.del(a);
        table.insert(a); // ok
        tmp = table.search(2);
        std::cout << tmp.data << std::endl;
        return 0;
    }
    

    9a504fc2d5628535f161962092ef76c6a7ef63299c86aa6f6cc2111d8976324819b6db9c9V3GUF5D5O3600059V3GUFKN5O3600059VF7PH1S5O3500059VMB3CJC5O3600059VT974GB5O360005

  • 相关阅读:
    socat + kata + cgroup
    2018-8-10-卷积神经网络全面解析
    2019-8-31-PowerShell-通过-WMI-获取系统服务
    2019-8-31-PowerShell-通过-WMI-获取系统服务
    2018-2-13-不使用数据结构反转栈
    统计难题
    Keywords Search
    [JSOI2008]最大数
    Android(java)学习笔记1:多线程的引入
    欢迎使用CSDN-markdown编辑器
  • 原文地址:https://www.cnblogs.com/sunyongjie1984/p/4286900.html
Copyright © 2011-2022 走看看