LRUCache
class LRUCache { using ListIt = list< pair< int , int >> :: iterator; list< pair< int , int > > _LRUlist; int _capacity; unordered_map< int , ListIt> _hashmap; public : LRUCache ( int capacity) : _capacity ( capacity) { } int get ( int key) { auto it = _hashmap. find ( key) ; if ( it != _hashmap. end ( ) ) { ListIt listit = it-> second; _LRUlist. splice ( _LRUlist. begin ( ) , _LRUlist, listit) ; return listit-> second; } else return - 1 ; } void put ( int key, int value ) { auto it = _hashmap. find ( key) ; if ( it == _hashmap. end ( ) ) { if ( _hashmap. size ( ) == _capacity) { pair< int , int > back = _LRUlist. back ( ) ; _hashmap. erase ( back. first) ; _LRUlist. pop_back ( ) ; } _LRUlist. push_front ( make_pair ( key, value ) ) ; _hashmap. insert ( make_pair ( key, _LRUlist. begin ( ) ) ) ; } else { ListIt listit = it-> second; listit-> second = value ; _LRUlist. splice ( _LRUlist. begin ( ) , _LRUlist, listit) ; } }
} ;
字典树
class Trie {
private : struct TreeNode { vector< TreeNode* > next; bool isEnd; TreeNode ( ) { isEnd = false ; next. resize ( 26 , nullptr) ; } } ; void deleteTree ( TreeNode* node) { if ( node == nullptr) return ; for ( TreeNode* nextNode : node-> next) deleteTree ( nextNode) ; delete node; } public : TreeNode* root; Trie ( ) { root = new TreeNode ( ) ; } ~ Trie ( ) { deleteTree ( root) ; } void insert ( const std:: string & word) { TreeNode* cur = root; for ( char ch : word) { int index = ch - 'a' ; if ( cur-> next[ index] == nullptr) cur-> next[ index] = new TreeNode ( ) ; cur = cur-> next[ index] ; } cur-> isEnd = true ; } bool search ( const std:: string & word) { TreeNode* cur = root; for ( char ch : word) { int index = ch - 'a' ; if ( cur-> next[ index] == nullptr) return false ; cur = cur-> next[ index] ; } return cur-> isEnd; } bool startsWith ( const std:: string & prefix) { TreeNode* cur = root; for ( char ch : prefix) { int index = ch - 'a' ; if ( cur-> next[ index] == nullptr) return false ; cur = cur-> next[ index] ; } return true ; } bool query ( const string & s) { TreeNode* cur = root; for ( char c : s) { int u = c - 'a' ; cur = cur-> next[ u] ; if ( ! cur-> isEnd) return false ; } return true ; }
} ;
布隆过滤器
#pragma once #include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <array>
#include <time.h>
#include <queue>
#include <stack>
#include <string>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <functional>
#include <assert.h>
using namespace std ;
template < size_t N>
class bitmap
{
private : vector< char > _bits; public : bitmap ( ) { _bits. resize ( N / 8 + 1 , 0 ) ; } void insert_setone ( size_t x) { size_t i = x / 8 ; size_t j = x % 8 ; _bits[ i] |= ( 1 << j) ; } void erase_setzero ( size_t x) { size_t i = x / 8 ; size_t j = x % 8 ; _bits[ i] &= ~ ( 1 << j) ; } bool judge ( size_t x) { size_t i = x / 8 ; size_t j = x % 8 ; return _bits[ i] & ( 1 << j) ; }
} ; void test_bitmap1 ( )
{ bitmap< 100> bm; bm. insert_setone ( 10 ) ; bm. insert_setone ( 11 ) ; bm. insert_setone ( 15 ) ; cout << bm. judge ( 10 ) << endl; cout << bm. judge ( 15 ) << endl; bm. erase_setzero ( 10 ) ; cout << bm. judge ( 10 ) << endl; cout << bm. judge ( 15 ) << endl; bm. erase_setzero ( 10 ) ; bm. erase_setzero ( 15 ) ; cout << bm. judge ( 10 ) << endl; cout << bm. judge ( 15 ) << endl;
} void test_bitmap2 ( )
{ bitmap< 0xFFFFFFFF> bm;
}
struct BKDR_Hash
{ size_t operator ( ) ( const string & s) { size_t value = 0 ; for ( auto & ch : s) { value = value * 31 + ch; } return value ; }
} ;
struct AP_Hash
{ size_t operator ( ) ( const string & s) { size_t value = 0 ; for ( long i = 0 ; i < s. size ( ) ; i++ ) { size_t ch = s[ i] ; if ( ( i & 1 ) == 0 ) value ^= ( ( value << 7 ) ^ ch ^ ( value >> 3 ) ) ; else value ^= ( ~ ( ( value << 11 ) ^ ch ^ ( value >> 5 ) ) ) ; } return value ; }
} ;
struct DJB_Hash
{ size_t operator ( ) ( const string & s) { size_t value = 5381 ; for ( auto ch : s) { value += ( value << 5 ) + ch; } return value ; }
} ; template < size_t N, class K = string , class Hash1 = BKDR_Hash, class Hash2 = AP_Hash, class Hash3 = DJB_Hash>
class BloomFilter
{ private : static const size_t num = 4 ; bitmap< num * N> _bm;
public : void insert_setone ( const K & key) { size_t len = num * N; size_t hash1 = Hash1 ( ) ( key) % len; _bm. insert_setone ( hash1) ; size_t hash2 = Hash2 ( ) ( key) % len; _bm. insert_setone ( hash2) ; size_t hash3 = Hash3 ( ) ( key) % len; _bm. insert_setone ( hash3) ; } bool judge ( const K & key) { size_t len = N * num; size_t hash1 = Hash1 ( ) ( key) % len; if ( ! _bm. judge ( hash1) ) { return false ; } size_t hash2 = Hash2 ( ) ( key) % len; if ( ! _bm. judge ( hash2) ) { return false ; } size_t hash3 = Hash3 ( ) ( key) % len; if ( ! _bm. judge ( hash3) ) { return false ; } return true ; }
} ;
void test_bloomfilter1 ( )
{ BloomFilter< 100> bf; bf. insert_setone ( "sort" ) ; bf. insert_setone ( "bloom" ) ; bf. insert_setone ( "hello world hello bit" ) ; bf. insert_setone ( "test" ) ; bf. insert_setone ( "etst" ) ; bf. insert_setone ( "estt" ) ; cout << bf. judge ( "sort" ) << endl; cout << bf. judge ( "bloom" ) << endl; cout << bf. judge ( "hello world hello bit" ) << endl; cout << bf. judge ( "etst" ) << endl; cout << bf. judge ( "test" ) << endl; cout << bf. judge ( "estt" ) << endl; cout << bf. judge ( "ssort" ) << endl; cout << bf. judge ( "tors" ) << endl; cout << bf. judge ( "ttes" ) << endl;
}
void test_bloomfilter2 ( )
{ srand ( time ( 0 ) ) ; const size_t N = 10000 ; BloomFilter< N> bf; vector< string > v1; string url = "https://www.gitee.com/Ape-LHR/apes-warehouse/547993.html" ; for ( size_t i = 0 ; i < N; ++ i) { v1. push_back ( url + to_string ( i) ) ; } for ( auto & str : v1) { bf. insert_setone ( str) ; } vector< string > v2; for ( size_t i = N; i < 2 * N; ++ i) { v2. push_back ( url + to_string ( i) ) ; } size_t count1 = 0 ; for ( auto & str : v2) { if ( bf. judge ( str) ) ++ count1; } double rate1 = ( double ) count1 / ( double ) N; cout << "相似字符串误判率 :" << rate1 * 100 << "%" << endl; vector< string > v3; string url2 = "https://www.csdn.net/?spm=1001.2014.3001.4476" ; for ( size_t i = 0 ; i < N; ++ i) { v3. push_back ( url2 + to_string ( i + rand ( ) ) ) ; } size_t count2 = 0 ; for ( auto & str : v3) { if ( bf. judge ( str) ) ++ count2; } double rate2 = ( double ) count2 / ( double ) N; cout << "不相似字符串误判率:" << rate2 * 100 << "%" << endl;
}