• 温故而知新--hashtable


    哈希在实际使用中主要是当作私有内存,对数据进行插入和查找,哈希数据元素越多,操作的时候消耗的性能就越到,最明显的是当数据元素达到哈希的容量大小时,插入数据冲突概率会变大,并慢慢的退化为数组。

    本例子中将会定义一个简单的hashtable。示例如下:
    #include <iostream>
    #include <list>
    #include <string>
    using namespace std;
    class CHashTable{
    public:
    	typedef list<int>::iterator ListIter;
    private:
    	list<int> m_Container[3];//三个链表
    	int HashFunction(const int& v) const;
    	int m_Count;
    public:
    	CHashTable();
    	~CHashTable();
    	void Insert(const int& v);
    	bool Find(const int& v);
    	bool Delete(const int& v);    
    	int Count() const;
    };	
    CHashTable::CHashTable(){
    	m_Count = 0;
    }
    CHashTable::~CHashTable(){
    	m_Count = 0;
    	for(int i=0;i<3;i++){
    		m_Container[i].clear();
    	}
    }
    //哈希计算方法
    int CHashTable::HashFunction(const int &v) const{
    	return v%3;
    }
    //插入元素
    void CHashTable::Insert(const int &v){
    	m_Container[HashFunction(v)].push_back(v);
    	m_Count++;
    }
    //查找元素
    bool CHashTable::Find(const int &v){
    	int iResKey = HashFunction(v);
    	for(ListIter it = m_Container[iResKey].begin();it != m_Container[iResKey].end();it++){
    		if(v == *it){
    			return true;
    		}
    	}
    	return false;
    }
    bool CHashTable::Delete(const int& v){
    	int iResKey = HashFunction(v);
    	for(ListIter it = m_Container[iResKey].begin();it != m_Container[iResKey].end();it++){
    		if(v == *it){
    			m_Container[iResKey].erase(it);
    			m_Count --;
    			return true;
    		}
    	}
    	return false;
    }
    int CHashTable::Count() const{
    	return m_Count;
    }
    int main(int argc, char *argv[]) {
    	CHashTable myhash;
    	//initialise the hash
    	for(int i=0;i<10;i++){A
    		myhash.Insert(i);
    	}
    	//return the size of hash
    	std::cout<<"myhash size is:"<<myhash.Count()<<endl;
    	
    	std::cout<<"find the element 5: ";
    	std::string strText = myhash.Find(5)? "yeah":"oh,no";
    	std::cout<<strText<<std::endl;
    	std::cout<<"del the element 5: "<<std::endl;
    	myhash.Delete(5);
    	std::cout<<"afther del find the element 5: ";
    	strText = (myhash.Find(5)? "yeah":"oh,no");
    	std::cout<<strText<<std::endl;
    	std::cout<<"myhash size is:"<<myhash.Count()<<endl;
    	return 0;
    }
    

  • 相关阅读:
    Android NDK 开发中 adb logcat 命令的使用
    android 工程里缺少 R.java 文件原因和解决方法
    用Linux命令行实现删除和复制指定类型的文件
    重载操作符与转换
    复制控制
    管理类的指针成员
    复制构造函数
    static类成员(变量和函数)
    lock failed, MQ already started 问题处理
    Mac无法启动RocketMQ,日志显示,runserver.sh: line 91: /Library/Internet: No such file or directory
  • 原文地址:https://www.cnblogs.com/newzol/p/6596341.html
Copyright © 2020-2023  润新知