当前位置: 首页 > news >正文

做wordpress 下载站设计素材下载网站

做wordpress 下载站,设计素材下载网站,做百度推广和企业网站那个有效果吗,wordpress论坛搭建文章目录 前言一、哈希思想二、哈希表概念三、哈希函数1、哈希函数设计原则2、常用的哈希函数 四、哈希冲突1、什么是哈希冲突2、解决哈希冲突闭散列开散列 五、哈希表的性能分析时间复杂度分析空间复杂度分析 前言 一、哈希思想 哈希思想#xff08;Hashing#xff09;是计… 文章目录 前言一、哈希思想二、哈希表概念三、哈希函数1、哈希函数设计原则2、常用的哈希函数 四、哈希冲突1、什么是哈希冲突2、解决哈希冲突闭散列开散列 五、哈希表的性能分析时间复杂度分析空间复杂度分析 前言 一、哈希思想 哈希思想Hashing是计算机科学中一种非常重要的思想它主要用于实现数据的快速查找、去重、以及作为数据结构如哈希表HashTable或哈希集合Hash Set的基础。哈希思想的核心在于通过一个哈希函数Hash Function将任意长度的输入通常称为键或关键字映射到一个固定长度的输出这个输出通常是一个整数我们称之为哈希值Hash Value或哈希码Hash Code。 二、哈希表概念 哈希表Hash Table是一种使用哈希函数组织数据以支持快速插入、删除和查找操作的数据结构。它是通过把键Key映射到表中一个位置来访问记录以加快查找的速度。这个映射函数称为哈希函数存放记录的数组称为哈希表。 三、哈希函数 1、哈希函数设计原则 1哈希函数的定义域必须包括需要存储的全部关键码而如果散列表允许有m个地址时其值 域必须在0到m-1之间。 2哈希函数计算出来的地址能均匀分布在整个空间中。 3哈希函数应该比较简单。 2、常用的哈希函数 1 直接定址法–(常用) A. 直接定址法通过某种固定的计算方式直接将关键字映射到哈希表的某个位置上。这种映射通常是线性的即哈希地址与关键字之间存在一种直接的、确定的数学关系。 B. 计算公式 直接定址法的计算公式一般形式为 H(key)a×keyb 其中H(key) 表示关键字 key 的哈希地址a 和 b 是根据哈希表长度和关键字分布情况确定的常数。这个公式可以根据具体情况进行调整但核心思想是通过简单的数学运算将关键字映射到哈希表的一个位置。 C.特点 简单直接直接定址法的计算过程简单直接没有复杂的迭代或递归过程。 确定性对于同一个关键字无论计算多少次其哈希地址都是相同的这保证了哈希表的确定性。 适用范围有限直接定址法通常适用于关键字分布均匀且范围较小的情况。如果关键字范围过大或分布不均匀可能会导致哈希表的某些位置空闲而另一些位置拥挤。 D. 应用场景 直接定址法适用于一些特定的应用场景如 关键字集合已知且固定不变的情况。 关键字范围较小且分布均匀的情况。 对哈希表的性能要求不是特别高的情况。 E.注意事项:在使用直接定址法时需要注意以下几点 根据关键字集合的实际情况选择合适的 a 和 b 值以确保哈希地址分布均匀。 如果关键字范围过大或分布不均匀可能需要考虑使用其他哈希函数构造方法如除留余数法、平方取中法等。 在实际应用中还需要考虑哈希表的扩容和冲突解决机制以确保哈希表的性能。 综上所述直接定址法是哈希表中一种简单直观的哈希函数构造方法适用于特定的应用场景。在使用时需要根据实际情况进行选择和调整。 2除留余数法 A.除留余数法取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。 即H(key)key%p 其中p是一个整数且通常满足p≤mm为散列表的长度。为了确保哈希表的性能p的选择很关键一般推荐p为质数或者至少是一个不包含小于20质因子的合数。 B.特点与优势 简单性除留余数法的计算过程相对简单容易实现。 灵活性通过调整p的值可以在一定程度上控制哈希表的性能。 适用性适用于大多数关键字分布的情况尤其是当关键字范围较大时。 C.缺点 可能造成key冲突。 四、哈希冲突 1、什么是哈希冲突 对于两个数据元素的关键字 k i k_i ki​和 k j k_j kj​(i ! j)有 k i k_i ki​ ! k j k_j kj​但有Hash( k i k_i ki​) Hash( k j k_j kj​)即不同关键字通过相同哈希函数计算出相同的哈希地址(哈希函数设计不够合理)该种现象称为哈希冲突或哈希碰撞如上述除留余数法中的5和13。 2、解决哈希冲突 闭散列 闭散列的基本原理是当发生哈希冲突时如果哈希表未被装满那么在哈希表中必然还有空位置。因此可以把产生冲突的元素存放到冲突位置的“下一个”空位置中去。这个“下一个”空位置可以通过某种探测方法找到如线性探测、二次探测等。 1探测方法 线性探测 从发生冲突的位置开始依次向后探测直到找到空位置为止。 例如如果元素A的哈希地址为i但位置i已被占用则依次检查i1, i2, …直到找到空位置。 二次探测 发生哈希冲突时通过二次探测法寻找“下一个”空位置。 公式为Hi (H0 i2) % m 或 Hi (H0 - i2) %m其中H0是通过哈希函数计算得到的初始位置m是哈希表的大小i是探测次数i1,2,3,…(m-1)/2。 2使用闭散列实现哈希表 基本框架 //将K转化为整形 templateclass K class InvertSize_t { public:size_t operator()(const K key){return (size_t)key;} }; //string类特化 template class InvertSize_tstring { public:size_t operator()(const string key){size_t sum 0;for (auto e : key){sum sum * 31 e;}return sum;} };//状态表示 enum State { EMPTY, EXIST, DELETE };//闭散列 templateclass K, class V,class InvertKey InvertSize_tK class HashTable {//节点struct Elem{pairK, V _val; //数据State _state; //状态表示Elem(pairK, V val pairK, V()):_val(val),_state(EMPTY){}};public://默认容量为10HashTable(size_t capacity 10): _ht(capacity), _size(0){}private:vectorElem _ht;size_t _size; };模板参数 K键值类型 V数据类型 InvertKey将键值类型转化为整形的哈希函数关于该函数的设计可参考字符串哈希算法 节点成员变量 标志当前位置的状态_state空、存在、删除 键值与数据构成的对组_val 闭散列哈希表类成员变量 当前存在元素个数_size 储存哈希表的线性表_ht默认长度为10 插入 负载因子 哈希表中的负载因子Load Factor是一个重要的概念它用于衡量哈希表的填充程度即哈希表中已存储元素的占用程度当超过一定程度就进行扩容。 步骤 1判断键值是否存在若存在插入失败不存在找到适合位置插入。 2判断是否需要扩容 3将键值转化为整形再通过哈希函数找到哈希值再通过线性探测也可以使用二次探测找到合适位置为空或者被删除的位置进行元素储存。 4元素个数1状态修改为存在。 查找 步骤 1将键值转化为整形再通过哈希函数找到哈希值再通过线性探测也可以使用二次探测查找。 2当前哈希值位置如果为空说明不存在该值如果为删除就继续使用线性探测如果为存在且键值不相同则继续如果为存在且键值相同则成功找到。 删除 步骤 1判断键值是否存在若不存在删除失败存在找到并删除。 2将键值转化为整形再通过哈希函数找到哈希值再通过线性探测也可以使用二次探测找到该元素。 3元素个数-1状态修改为删除。 当前元素个数 直接返回 _size即可。 判断是否为空 通过判断_size是否等于0 代码实现 //状态表示 enum State { EMPTY, EXIST, DELETE };//闭散列 templateclass K, class V,class InvertKey InvertSize_tK class HashTable {//节点struct Elem{pairK, V _val; //数据State _state; //状态表示Elem(pairK, V val pairK, V()):_val(val),_state(EMPTY){}};public:HashTable(size_t capacity 10): _ht(capacity), _size(0){}// 插入bool Insert(const pairK, V val){//是否存在存在就不会插入if (Find(val.first)) return false;//转化为整数InvertKey ik;//除留余数法查找int hashi ik(val.first) % _ht.size();//超过负载因子if (_size * 10 / _ht.size() 7){HashTable tmp(_ht.size() * 2);for (int i 0; i _ht.size(); i){if (_ht[i]._state EXIST){tmp.Insert(_ht[i]._val);}}_ht.swap(tmp._ht);}//当删除或者为空储存while (_ht[hashi]._state EXIST){hashi hashi % _ht.size();}_ht[hashi] Elem(val);_ht[hashi]._state EXIST;_size;return true;}// 查找Elem* Find(const K key){InvertKey ik; //转化整形仿函数int hashi ik(key) % _ht.size(); //除留余数法求哈希地址//查到为空即停止while (_ht[hashi]._state ! EMPTY){//符合条件if (_ht[hashi]._state EXIST _ht[hashi]._val.first key){return _ht[hashi];}hashi hashi % _ht.size();}return nullptr;}// 删除bool Erase(const K key){//查找该值Elem* cur Find(key);//不存在情况if (cur nullptr) return false;cur-_state DELETE;//改变状态_size--; //元素个数--return true;}//存在个数size_t Size()const{return _size;}//是否为空bool Empty() const{return _size 0;}private:vectorElem _ht;size_t _size; };开散列 1开散列概念 开散列法又叫链地址法(开链法)首先对关键码集合用散列函数计算散列地址具有相同地 址的关键码归于同一子集合每一个子集合称为一个桶各个桶中的元素通过一个单链表链接起来各链表的头结点存储在哈希表中。 2使用开散列实现哈希表 基础框架 //将K转化为整形 templateclass K class InvertSize_t { public:size_t operator()(const K key){return (size_t)key;} };//string类特化 template class InvertSize_tstring { public:size_t operator()(const string key){size_t sum 0;for (auto e : key){sum sum * 31 e;}return sum;} };//哈希表节点 templateclass T struct HashBucketNode {HashBucketNode(const T val): _pNext(nullptr), _val(val){}HashBucketNodeT* _pNext; //前驱指针T _val; //数据 };templateclass K,class T, class KeyOfValue, class HF class HashBucket {typedef HashBucketNodeT Node; //节点重命名typedef HashBucketK,T, KeyOfValue, HF Self; //自身重命名 public://构造函数 哈希桶初始化大小为10HashBucket(size_t capacity 10): _table(10), _size(0) {} private:vectorNode* _table; //储存哈希桶头节点指针size_t _size; // 哈希表中有效元素的个数 };哈希表节点模板参数 T数据类型 哈希表节点成员变量 _pNext前驱指针 _val数据 哈希表类模板参数 K键值类型 T数据类型 KeyOfValue将数据转化为键值的仿函数类型 HF将键值类型转化为整形的哈希函数 哈希表成员变量 _table储存链表头节点指针的线性表 _size元素个数 迭代器 迭代器类 根据开散列哈希表的特性设计该迭代器为正向迭代器。 基础框架 templateclass K,class T,class KeyOfValue,class HF,class Ptr,class Ref struct HsIterator { //重命名 typedef HashBucketNodeT Node; typedef HashBucketK, T, KeyOfValue, HF Hash; typedef HsIteratorK, T, KeyOfValue, HF,Ptr,Ref Self; //成员变量 Node* _cur; //当前指针 const Hash* _hash; //哈希表指针 //构造函数 HsIterator(const Hash* hash, Node* cur ):_cur(cur),_hash(hash){} }迭代器类模板参数 K键值类型 T数据类型 KeyOfValue将数据转化为键值的仿函数类型 HF将键值类型转化为整形的哈希函数 Ptr: T* /const T* Ref: T / const T 迭代器类成员变量 _cur哈希节点指针 _hash:哈希表指针 重载前置 步骤 1判断迭代器中_cur的前驱指针是否为空。 2_cur的前驱指针不为空说明该哈希桶没有遍历完_cur _cur-_pNext 即可。 3_cur的前驱指针为空说明该哈希桶已经遍历完了此时需要通过_cur-_val找到当前哈希桶的哈希值哈希值再通过哈希表找到下一个哈希桶如果不为空_cur等于哈希桶的头节点结束否则继续直到找到不为空的或者将所有桶都遍历一遍。 重载 和 ! 通过指针是否相等来判断。 重载解引用 通过返回_cur-_val的引用。 重载- 通过返回_cur-_val的地址。 迭代器类代码实现 //迭代器 templateclass K,class T,class KeyOfValue,class HF,class Ptr,class Ref struct HsIterator {typedef HashBucketNodeT Node;typedef HashBucketK, T, KeyOfValue, HF Hash;typedef HsIteratorK, T, KeyOfValue, HF,Ptr,Ref Self;Node* _cur;const Hash* _hash;HsIterator(const Hash* hash, Node* cur ):_cur(cur),_hash(hash){}Self operator(){ KeyOfValue func;HF hf;if (_cur-_pNext ! nullptr){_cur _cur-_pNext;}else{int hashi hf(func(_cur-_val)) % _hash-_table.size();Node* cur _hash-_table[hashi];while (hashi _hash-_table.size() cur nullptr){cur _hash-_table[hashi];hashi; }_cur cur;}return *this;}bool operator(const Self it){return _cur it._cur;}bool operator! (const Self it){return _cur ! it._cur;}Ref operator*(){return _cur-_val;}Ptr operator-(){return (_cur-_val);} }; 哈希表迭代器 begin() 找到第一个不为空的哈希桶用该哈希桶头节点去构造迭代器。 end() 直接利用nullptr构造迭代器。 插入 步骤 1判断哈希表中是否存在该键值 。 2如果存在插入失败结束。 加粗样式 3如果不存在判断是否超过负载因子超过就需要扩容。 4通过KeyOfValue 和 HF 函数来求哈希值通过哈希值找到哈希桶通过头插法将数据插入。 删除 步骤 1判断哈希表中是否存在该键值 。 2如果不存在删除失败结束。 3通过KeyOfValue 和 HF 函数来求哈希值通过哈希值找到哈希桶将节点重新连接再进行删除。 查找 通过KeyOfValue 和 HF 函数来求哈希值通过哈希值找到哈希桶在该桶遍历该桶。 大小 直接返回_size。 判断是否为空 通过_size是否等于0来判断。 清空 遍历哈希表如果哈希桶不为空再将哈希桶中的每个节点删除最后在置空。 析构函数 复用清空接口即可。 拷贝构造 遍历需要拷贝的哈希表如果哈希桶不为空再将哈希桶中的每个节点插入新哈希表即可。 赋值重载 先清理原来的哈希表再利用传过来的临时哈希表然后复用交换接口进行交换即可。 开散列哈希表代码实现 //将数据转化为整数 templateclass K class HashFunc { public:size_t operator()(const K val){return val;} };template class HashFuncstring { public:size_t operator()(const string s){const char* str s.c_str();unsigned int seed 131; // 31 131 1313 13131 131313unsigned int hash 0;while (*str){hash hash * seed (*str);}return hash;} };//将数据转化为键值 templateclass K struct KeyOfValue {const K operator()(const K data){return data;} };//前置声明 --给迭代器向上查找 templateclass K, class T, class KeyOfValue, class HF class HashBucket;//哈希节点 templateclass T struct HashBucketNode {HashBucketNode(const T val): _pNext(nullptr), _val(val){}HashBucketNodeT* _pNext; T _val; //数据 };//迭代器 templateclass K,class T,class KeyOfValue,class HF,class Ptr,class Ref struct HsIterator {typedef HashBucketNodeT Node;typedef HashBucketK, T, KeyOfValue, HF Hash;typedef HsIteratorK, T, KeyOfValue, HF,Ptr,Ref Self;Node* _cur;const Hash* _hash;HsIterator(const Hash* hash, Node* cur ):_cur(cur),_hash(hash){}Self operator(){ KeyOfValue func;HF hf;if (_cur-_pNext ! nullptr){_cur _cur-_pNext;}else{int hashi hf(func(_cur-_val)) % _hash-_table.size();Node* cur _hash-_table[hashi];while (hashi _hash-_table.size() cur nullptr){cur _hash-_table[hashi];hashi; }_cur cur;}return *this;}bool operator(const Self it){return _cur it._cur;}bool operator! (const Self it){return _cur ! it._cur;}Ref operator*(){return _cur-_val;}Ptr operator-(){return (_cur-_val);} }; templateclass K,class T, class KeyOfValue, class HF class HashBucket {typedef HashBucketNodeT Node; //节点重命名typedef HashBucketK,T, KeyOfValue, HF Self; //自身重命名 public:typedef HsIteratorK, T, KeyOfValue, HF, T*, T Iterator; //迭代器重命名typedef HsIteratorK, T, KeyOfValue, HF,const T*,const T ConstIterator; //const迭代器重命名//迭代器作为有友元templateclass K, class T, class KeyOfValue, class HF, class Ptr, class Reffriend struct HsIterator;//构造函数 哈希桶初始化大小为10HashBucket(size_t capacity 10): _table(10), _size(0){}//拷贝构造HashBucket(const Self self){_table.resize(10);//通过遍历Self和插入接口即可for (int i 0; i self._table.size(); i){Node* cur self._table[i];while (cur){Insert(cur-_val);cur cur-_pNext;}}}//赋值重载Self operator(Self self){Clear();Swap(self);return *this;}~HashBucket(){Clear();}Iterator Begin(){//找到第一个不为空的桶int i 0;while (_table[i] nullptr){i;}return Iterator(this, _table[i]);}Iterator End(){//用nullptr代表最后一个元素的后一个位置return Iterator(this, nullptr);}ConstIterator Begin() const{int i 0;while (_table[i] nullptr){i;}return ConstIterator(this, _table[i]);}ConstIterator End() const{return ConstIterator(this, nullptr);}//返回值为了unordered_map的重载[]能够使用pairbool, IteratorInsert(const T val){//将数据转化为键值KeyOfValue func;//不允许重复键值Iterator it Find(func(val));if ( it ! End()){return make_pair(false,it);}//将键值转化为整形哈希地址HF ik;int hashi ik(func(val)) % _table.size();//超过负载因子if (_size _table.size()){//库容2倍vectorNode* tmp(_table.size() * 2);//将原来的数据转移到tmpfor (int i 0; i _table.size(); i){if (_table[i] ! nullptr){Node* cur _table[i];while (cur){//重新获取哈希地址int k ik(func(cur-_val)) % tmp.size();//头插入tmpNode* next cur-_pNext;cur-_pNext tmp[k];tmp[k] cur;cur next;}}}//将容器进行交换_table.swap(tmp);}//插入Node* cur new Node(val);cur-_pNext _table[hashi];_table[hashi] cur;_size;return make_pair(true, Iterator(this,cur));}// 删除哈希桶中为data的元素(data不会重复)bool Erase(const K key){//将数据转化为键值KeyOfValue func;//将数据转化为键值HF ik;int hashi ik(func(key)) % _table.size();//获取头节点Node* cur _table[hashi];//前驱指针Node* prev nullptr;while (cur){//找到重新连接if (func(cur-_val) key){if (prev nullptr){_table[hashi] cur-_pNext;}else{prev-_pNext cur-_pNext;}_size--;delete cur;return true;}prev cur;cur cur-_pNext;}return false;}Iterator Find(const K key){//将数据转化为键值KeyOfValue func;//将数据转化为键值HF ik;int hashi ik(key) % _table.size();//获取头节点Node* cur _table[hashi];//查找while (cur){if (func(cur-_val) key){return Iterator(this,cur);}cur cur-_pNext;}return Iterator(this, nullptr);}//大小size_t Size()const{return _size;}//是否为空bool Empty()const{return 0 _size;}//清空void Clear(){//遍历容器清空每个节点for (int i 0; i _table.size(); i){Node* cur _table[i];while (cur){Node* next cur-_pNext;delete cur;cur next;}//最后置空_table[i] nullptr;}//大小为0_size 0;}//交换void Swap(Self ht){//交换内部容器即可_table.swap(ht._table);swap(_size, ht._size);}private:vectorNode* _table; //储存哈希桶头节点指针size_t _size 0; // 哈希表中有效元素的个数 };五、哈希表的性能分析 时间复杂度分析 1、哈希表的时间复杂度分析主要关注其三个基本操作查找Search、插入Insert和删除Delete。这些操作的时间复杂度通常依赖于几个关键因素哈希函数的质量、哈希表的负载因子即表中元素数量与表容量的比值、以及冲突解决策略。 2、链地址法Separate Chaining 在链地址法中每个槽位维护一个链表所有映射到该槽位的关键字都存储在这个链表中。查找、插入和删除操作的时间复杂度取决于链表的长度。在最坏情况下即所有关键字都映射到同一个槽位这些操作的时间复杂度会退化到O(n)其中n是哈希表中元素的数量。但在平均情况下如果哈希函数设计得当且负载因子适中这些操作的时间复杂度可以接近O(1)。 3、开放地址法Open Addressing 在开放地址法中当发生哈希冲突时算法会尝试在哈希表中的另一个槽位找到空闲位置来存储新的关键字。查找、插入和删除操作可能需要遍历多个槽位直到找到所需的关键字或空闲位置。最常用的开放地址法是线性探测Linear Probing、二次探测Quadratic Probing。这些方法的时间复杂度同样取决于负载因子和哈希函数的质量。在平均情况下如果负载因子适中且哈希函数分布均匀这些操作的时间复杂度也可以接近O(1)。但在最坏情况下例如所有关键字都映射到连续的槽位并且这些槽位都被占满这些操作的时间复杂度可能会退化到O(n)。 4、总结 哈希表的时间复杂度通常取决于哈希函数的质量、装载因子以及冲突解决策略。在理想情况下哈希表的操作可以达到O(1)的时间复杂度。但在实际情况中由于哈希冲突的存在这些操作的时间复杂度可能会退化。然而通过优化哈希函数、控制装载因子和选择合适的冲突解决策略我们可以将哈希表的操作保持在接近O(1)的时间复杂度范围内。 空间复杂度分析 1、哈希表的空间复杂度通常是O(n)其中n是哈希表中存储的元素个数。这是因为哈希表通过分配一个固定大小的数组或类似的连续存储空间来存储元素并且这个数组的大小通常是基于预期的元素数量来选择的。尽管哈希表可能会预留一些额外的空间以减少哈希冲突和提高性能但总体上哈希表所需的空间与存储的元素数量成线性关系。 2、链地址法Separate Chaining在链地址法中每个槽位维护一个链表来存储所有映射到该槽位的关键字。这种情况下哈希表的空间复杂度仍然是O(n)因为虽然链表的长度可能随着冲突的增加而增长但总体上所有链表占用的空间仍然与存储的元素数量成线性关系。 3、开放地址法Open Addressing在开放地址法中哈希表通过探测空闲槽位来解决冲突。这种方法不需要额外的数据结构来存储冲突的元素因此从空间复杂度的角度来看它通常比链地址法更节省空间。然而它可能会导致哈希表在达到其容量之前就开始拒绝新的插入操作因为找不到空闲槽位从而需要更频繁地进行扩容操作。
文章转载自:
http://www.morning.8yitong.com.gov.cn.8yitong.com
http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn
http://www.morning.bzsqr.cn.gov.cn.bzsqr.cn
http://www.morning.fy974.cn.gov.cn.fy974.cn
http://www.morning.qydgk.cn.gov.cn.qydgk.cn
http://www.morning.ggxbyhk.cn.gov.cn.ggxbyhk.cn
http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn
http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn
http://www.morning.yswxq.cn.gov.cn.yswxq.cn
http://www.morning.yksf.cn.gov.cn.yksf.cn
http://www.morning.wfbs.cn.gov.cn.wfbs.cn
http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn
http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn
http://www.morning.gbyng.cn.gov.cn.gbyng.cn
http://www.morning.lcplz.cn.gov.cn.lcplz.cn
http://www.morning.gbfck.cn.gov.cn.gbfck.cn
http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn
http://www.morning.psxxp.cn.gov.cn.psxxp.cn
http://www.morning.rgnp.cn.gov.cn.rgnp.cn
http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn
http://www.morning.prjty.cn.gov.cn.prjty.cn
http://www.morning.wgrm.cn.gov.cn.wgrm.cn
http://www.morning.rlbg.cn.gov.cn.rlbg.cn
http://www.morning.ysllp.cn.gov.cn.ysllp.cn
http://www.morning.ysfj.cn.gov.cn.ysfj.cn
http://www.morning.lfcnj.cn.gov.cn.lfcnj.cn
http://www.morning.kaylyea.com.gov.cn.kaylyea.com
http://www.morning.qjbxt.cn.gov.cn.qjbxt.cn
http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn
http://www.morning.rfjmy.cn.gov.cn.rfjmy.cn
http://www.morning.rkmsm.cn.gov.cn.rkmsm.cn
http://www.morning.ltpph.cn.gov.cn.ltpph.cn
http://www.morning.ryqsq.cn.gov.cn.ryqsq.cn
http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn
http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn
http://www.morning.drfcj.cn.gov.cn.drfcj.cn
http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn
http://www.morning.qjghx.cn.gov.cn.qjghx.cn
http://www.morning.kggxj.cn.gov.cn.kggxj.cn
http://www.morning.guangda11.cn.gov.cn.guangda11.cn
http://www.morning.kjcll.cn.gov.cn.kjcll.cn
http://www.morning.tsnq.cn.gov.cn.tsnq.cn
http://www.morning.lxhrq.cn.gov.cn.lxhrq.cn
http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn
http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn
http://www.morning.abgy8.com.gov.cn.abgy8.com
http://www.morning.tntqr.cn.gov.cn.tntqr.cn
http://www.morning.frnjm.cn.gov.cn.frnjm.cn
http://www.morning.llqch.cn.gov.cn.llqch.cn
http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn
http://www.morning.xqltq.cn.gov.cn.xqltq.cn
http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn
http://www.morning.xjtnp.cn.gov.cn.xjtnp.cn
http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn
http://www.morning.zpstm.cn.gov.cn.zpstm.cn
http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn
http://www.morning.bzfld.cn.gov.cn.bzfld.cn
http://www.morning.qklff.cn.gov.cn.qklff.cn
http://www.morning.phnbd.cn.gov.cn.phnbd.cn
http://www.morning.rzcfg.cn.gov.cn.rzcfg.cn
http://www.morning.nslwj.cn.gov.cn.nslwj.cn
http://www.morning.ktrh.cn.gov.cn.ktrh.cn
http://www.morning.saastob.com.gov.cn.saastob.com
http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn
http://www.morning.sqhlx.cn.gov.cn.sqhlx.cn
http://www.morning.qnwyf.cn.gov.cn.qnwyf.cn
http://www.morning.bppml.cn.gov.cn.bppml.cn
http://www.morning.kkqgf.cn.gov.cn.kkqgf.cn
http://www.morning.jwbfj.cn.gov.cn.jwbfj.cn
http://www.morning.wrfk.cn.gov.cn.wrfk.cn
http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com
http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn
http://www.morning.hpprx.cn.gov.cn.hpprx.cn
http://www.morning.gnwpg.cn.gov.cn.gnwpg.cn
http://www.morning.hpspr.com.gov.cn.hpspr.com
http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn
http://www.morning.xqgh.cn.gov.cn.xqgh.cn
http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn
http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn
http://www.morning.jwbnm.cn.gov.cn.jwbnm.cn
http://www.tj-hxxt.cn/news/248326.html

相关文章:

  • 电商型网站是否是趋势网站 推广 工具
  • 菏泽培训网站建设wordpress自定义模块
  • 郑州网站开发wordpress图片幻灯片
  • 学校建设网站的结论wordpress内网访问
  • 做内贸什么网站资源比较多seo网站推广招聘
  • 外贸网站系统电子商务网站成功的关键是
  • 汕头企业网站公司制作好看的wordpress页面
  • 做调查问卷用的网站或软件南通通州建设工程质量监督网站
  • 做cpa怎么建立自己网站域名注册免费
  • 词条有哪些网站可以做合肥网站建设推荐 晨飞网络
  • 西安正规网站建设公司网站如何安装dedecms
  • 被骗去国外做网站网站推广php 网站制作的意义
  • 做影视网站需要多大硬盘wordpress 多站点 主站点
  • 手机销售网站模板医院网站开发方案
  • 中山电商网站制作西安做视频网站公司
  • 做招商加盟做得比较好的网站网站的建设公司简介
  • cdr做网站流程西宁网络信息 网站建设
  • 温州网站设计网站建设网站c2c典型电子商务平台有哪些
  • 淮南网站优化公司wordpress主题免费共享
  • 商品网站怎么做温州高端网站建设
  • 蒙自市建设局网站化州网站开发公司
  • 广州专业网站改版wordpress单本小说模板
  • 普通网站和门户网站的区别网址大全快捷怎么来的
  • 标准通网站建设给公司做宣传网站的好处
  • windows网站建设教程好兄弟资源网在线看片
  • 济南企业营销型网站建设价格宣传片拍摄注意事项
  • 手机购物网站设计在线医疗网站建设
  • 仙游有人做网站2024中核招聘网最新招聘公告
  • 中国建设银行官网站下载弹幕网站是什么技术做的
  • 网站关站新乡seo外包