网站设计的一般步骤是什么?前端可以做网站吗

pingmian/2026/1/20 8:32:57/文章来源:
网站设计的一般步骤是什么?,前端可以做网站吗,做视频网站需要什么高端技术,seo需要懂代码吗前言 本文将会向你介绍哈希概念#xff0c;哈希方法#xff0c;如何解决哈希冲突#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中#xff0c;元素关键码与其存储位置之间没有对应的关系#xff0c;因此在查找一个元素时#xff0c;必须要经…前言 本文将会向你介绍哈希概念哈希方法如何解决哈希冲突以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中元素关键码与其存储位置之间没有对应的关系因此在查找一个元素时必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)平衡树中为树的高度即 O( l o g 2 N log_2N log2​N)搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法可以不经过任何比较一次直接从表中得到要搜索的元素。 如果构造一种存储结构通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一 一映射的关系那么在查找时通过该函数可以很快找到该元素。 当向该结构中 插入元素根据待插入元素的关键码以此函数计算出该元素的存储位置并按此位置进行存放搜索元素 对元素的关键码进行同样的计算把求得的函数值当做元素的存储位置在结构中按此位置取元素比较若关键码相等则搜索成功 该方式即为哈希方法哈希方法中使用的转换函数称为哈希函数构造出来的结构称为哈希表(Hash Table)(或者称散列表 例如数据集合{176459} 哈希函数设置为hash(key) key % size; size为存储元素底层空间总的大小。 2. 哈希方法 哈希方法我们通常对关键码key进行转换来确定存储的位置比如由字符串abc转换成一个整数作为存储的位置这个转换的方法称为哈希方法哈希方法中运用的函数叫做哈希函数 (1)直接定址法 ps哈希方法是一个广义的概念而哈希函数是哈希方法的一种具体实现。 1、直接定址法 值和位置关系唯一关系每个值都有一个唯一位置但是值很分散直接定址会导致空间开很大导致空间浪费 此方法运用于关键字范围集中量不大的情况关键字和存储位置是一对一的关系不存在哈希冲突 引入哈希冲突 哈希冲突概念不同关键字通过相同的哈希函数计算出相同的哈希存储位置不同的值映射到相同的位置上去这种现象被称为哈希冲突或哈希碰撞哈希冲突的发生与哈希函数的设计有关 (2)除留余数法 主要应用于关键字可以很分散量可以很大关键字和存储位置是多对一的关系的情况但是存在哈希冲突 3. 解决哈希冲突 (1)闭散列 概念 闭散列又称开放定址法指当前位置被占用哈希冲突开放空间里按照某种规则找一个没有被占用的位置存储 1、线性探测 从发生冲突的位置开始依次向后探测直到寻找到下一个空位置为止 Hashi hashi i(i0) 2、二次探测 探测公式发生变化 hashi i^2(i0) (2)开散列 开散列法又叫链地址法(开链法)首先对关键码集合用散列函数计算散列地址具有相同地 址的关键码归于同一子集合每一个子集合称为一个桶各个桶中的元素通过一个单链表链接起来各链表的头结点存储在哈希表中。 如图可观察到val值为44的节点和节点val值为4的节点发生哈希冲突 开散列中每个桶中放大都是发生哈希冲突的元素 引入负载因子 负载因子存储个数/空间的大小注意这里的空间的大小是size而不是capacity 由于在哈希表中operator[]操作会根据已有的元素数量即size()进行检查。因此在计算负载因子时要使用已有元素的个数除以哈希表的大小即size() size()函数返回的是当前哈希表中实际存储的元素数量而capacity()函数返回的是哈希表的容量即内部存储空间的大小) 负载因子存储关键字个数/空间大小 负载因子太大冲突可能会剧增冲突增加效率降低 负载因子太小冲突降低但是空间利用率就低了 5. 哈希表扩容 扩容的核心是先开辟新空间然后遍历旧空间的数据按照hashi hashi % Newsize重新建立映射然后将旧空间的数据拷贝到新空间去最后交换新旧哈希表本质上我们还是要对旧哈希表进行扩容因此最后要swap交换两表 6. 哈希表插入 三种状态EMPTY、EXIST、DELETE EMPTY表示该位置为空。 EXIST表示该位置被占用了。 DELETE表示该位置被删除了。 删除状态存在的含义 或许你会有疑问删除为什么不能直接设为空状态而是将被删除的状态设置为DELETE 7. 闭散列模拟实现 数据结构 struct Elem {pairK, V _val;State _state EMPTY; }; vectorElemK, V _ht;闭散列插入 闭散列的插入步骤是判断是否存在判断是否需要扩容结合负载因子遍历旧空间拷贝数据 关于闭散列的模拟实现核心步骤在上文都有讲这里就不再多作赘述具体可看下面的代码与注释 namespace Close_Hash {templateclass Tstruct HashFunc{size_t operator()(const T key){return (size_t)key;}};//因为字符串做键值非常常见库里面也特化了一份//BKDR算法这里不会展开来讲templatestruct HashFuncstring{size_t operator()(const string key){size_t hashi 0;for (auto ch : key){hashi hashi * 31 ch;}return hashi;}};enum State { EMPTY,EXIST,DELETE};template class K, class Vstruct Elem{pairK, V _val;State _state EMPTY;};templateclass K, class V, class Hash HashFuncKclass HashTable{public:HashTable(size_t capacity 3): _ht(capacity),_size(0), _totalSize(0){for (size_t i 0; i capacity; i)_ht[i]._state EMPTY;}// 插入bool Insert(const pairK, V val){Hash hf;_size _ht.size();//已有if (Find(val.first)){return false;}else{//扩容,负载因子0.6if ((double)_totalSize / _size 0.6){//开辟新空间size_t newsize _size * 2;HashTableK, V, Hash NewHt;NewHt._ht.resize(newsize);//遍历旧空间for (int i 0; i _size; i){if (_ht[i]._state EXIST){NewHt.Insert(_ht[i]._val);}}NewHt._ht.swap(_ht);}size_t hashi hf(val.first) % _size;//不为空向后查找while (_ht[hashi]._state EXIST){hashi;//如果超出数组长度hashi % _size;}//为空插入_ht[hashi]._val.first val.first;_ht[hashi]._val.second val.second;_ht[hashi]._state EXIST;_totalSize;return true;}}// 查找ElemK, V* Find(const K key){Hash hf;//线性探测size_t hashi hf(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();}//没有找到areturn nullptr;}// 删除bool Erase(const K key){ElemK, V* ret Find(key);//不为空就说明找到if (ret){ret-_state DELETE;--_totalSize;return true;}else return false;}private:size_t HashFunc(const K key){return key % _ht.capacity();}void CheckCapacity();private:vectorElemK, V _ht;size_t _size;size_t _totalSize; // 哈希表中的所有元素有效和已删除, 扩容时候要用到}; }测试 void Print(){for (int i 0; i _ht.size(); i){if (_ht[i]._state EXIST){//printf([%d]-%d\n, i, _tables[i]._kv.first);cout [ i ]- _ht[i]._val.first : _ht[i]._val.second endl;}else if (_ht[i]._state EMPTY){printf([%d]-\n, i);}else{printf([%d]-D\n, i);}}void TestHT1() {Close_Hash::HashTableint, int ht;int a[] { 4,14,24,34,5,7,1 };for (auto e : a){ht.Insert(make_pair(e, e));}ht.Print();ht.Insert(make_pair(3, 3));ht.Insert(make_pair(3, 3));ht.Insert(make_pair(-3, -3));ht.Print();cout endl;ht.Erase(3);;ht.Print();if (ht.Find(3)){cout 3存在 endl;}else{cout 3不存在 endl;}ht.Insert(make_pair(23, 3));ht.Insert(make_pair(3, 3));if (ht.Find(3)){cout 3存在 endl;}else{cout 3不存在 endl;}ht.Print(); } 8. 开散列模拟实现 数据结构 struct HashNode{HashNode* _next;pairK, V _val;HashNode(const pairK, V val):_next(nullptr),_val(val){}};typedef HashNodeK, V Node;vectorNode* _ht; 开散列插入 插入的主要逻辑是先查找是否存在判断是否需要扩容依据平衡因子开辟新空间然后遍历旧空间将旧空间的数据拷贝到新空间上需要根据新的映射关系待会会细讲最后插入节点 bool Insert(const pairK, V val) {Hash hf;//已有if (Find(val.first)){return false;}//扩容,负载因子1if (_totalSize _ht.size()){//开辟新空间size_t newsize _ht.size() * 2;vectorNode* NewHt;NewHt.resize(newsize);//遍历旧空间for (int i 0; i _ht.size(); i){Node* cur _ht[i];while (cur){//保存下一个结构体指针Node* next cur-_next;size_t hashi hf(cur-_val.first) % NewHt.size();//将新空间上hashi位置处的哈希桶链接到需要处理的当前节点cur-_next NewHt[hashi];NewHt[hashi] cur;//处理旧空间上哈希桶的下一个节点cur next;}//防止出现悬空指针的问题_ht[i] nullptr;} _ht.swap(NewHt);}//插入节点size_t hashi hf(val.first) % _ht.size();Node* newnode new Node(val);//头插newnode-_next _ht[hashi];_ht[hashi] newnode;_totalSize;return true; }以下是遍历旧空间拷贝数据的图解 插入过程图解 全部代码 namespace Open_Hash {templateclass Tstruct HashFunc{size_t operator()(const T key){if (key 0){return (size_t)key;}else{return abs(key);}}};//字符串哈希算法这里不展开讲采用的是BKDR算法templatestruct HashFuncstring{size_t operator()(const string key){size_t hashi 0;for (auto ch : key){hashi hashi * 31 ch;}return hashi;}};template class K, class Vstruct HashNode{HashNode* _next;pairK, V _val;HashNode(const pairK, V val):_next(nullptr),_val(val){}};templateclass K, class V, class Hash HashFuncKclass HashTable{public: HashTable(){_ht.resize(10);}~HashTable(){for (int i 0; i _ht.size(); i){Node* cur _ht[i];while (cur){Node* next cur-_next;delete cur;cur next;}//将当前哈希桶置空_ht[i] nullptr;}}typedef HashNodeK, V Node;// 插入bool Insert(const pairK, V val){Hash hf;//已有if (Find(val.first)){return false;}//扩容,负载因子1if (_totalSize _ht.size()){//开辟新空间size_t newsize _ht.size() * 2;vectorNode* NewHt;NewHt.resize(newsize);//遍历旧空间for (int i 0; i _ht.size(); i){Node* cur _ht[i];while (cur){//保存下一个结构体指针Node* next cur-_next;size_t hashi hf(cur-_val.first) % NewHt.size();//将新空间上hashi位置处的哈希桶链接到需要处理的当前节点cur-_next NewHt[hashi];NewHt[hashi] cur;//处理旧空间上哈希桶的下一个节点cur next;}//防止出现悬空指针的问题_ht[i] nullptr;}_ht.swap(NewHt);}//插入节点size_t hashi hf(val.first) % _ht.size();Node* newnode new Node(val);//头插newnode-_next _ht[hashi];_ht[hashi] newnode;_totalSize;return true;}//查找Node* Find(const K key){Hash hf;//线性探测size_t hashi hf(key) % _ht.size();Node* cur _ht[hashi];//遍历对应hashi位置处的哈希桶while (cur){if (cur-_val.first key){return cur;}cur cur-_next;}//没有找到return nullptr;}// 删除bool Erase(const K key){Hash hf;Node* ret Find(key);size_t hashi hf(key) % _ht.size();//不为空就说明找到if (ret){Node* cur _ht[hashi];Node* prev nullptr;//遍历当前哈希桶while (cur){if (cur-_val.first key){//判断是头删还是中间位置处的删除if (prev nullptr){_ht[hashi] cur-_next;}else{prev-_next cur-_next;}delete cur;return true;}prev cur;cur cur-_next;}}//未找到return false;}private:vectorNode* _ht;Node* _next nullptr;size_t _totalSize 0; // 哈希表中的所有元素有效和已删除, 扩容时候要用到}; }测试 //打印void Print1(){for (int i 0; i _ht.size(); i){Node* cur _ht[i];cout [ i ]:;//哈希桶不为空while(cur){cout ( cur-_val.first , cur-_val.second ) -;cur cur-_next;}cout endl;}cout endl;}void Print2(){for (int i 0; i _ht.size(); i){Node* cur _ht[i];//哈希桶不为空while (cur){cout cur-_val.first : cur-_val.second ;cur cur-_next;}}cout endl;} //测试void TestHT1(){HashTableint, int ht;int a[] { 4,14,24,34,5,7,1 };for (auto e : a){ht.Insert(make_pair(e, e));}ht.Insert(make_pair(3, 3));ht.Insert(make_pair(3, 3));ht.Insert(make_pair(-3, -3));ht.Print1();ht.Erase(3);ht.Print1();if (ht.Find(3)){cout 3存在 endl;}else{cout 3不存在 endl;}ht.Insert(make_pair(3, 3));ht.Insert(make_pair(23, 3));//ht.Insert(make_pair(-9, -9));ht.Insert(make_pair(-1, -1));ht.Print1();}void TestHT2(){string arr[] { 香蕉, 甜瓜,苹果, 西瓜, 苹果, 西瓜, 苹果, 苹果, 西瓜, 苹果, 香蕉, 苹果, 香蕉 };//HashTablestring, int, HashFuncString ht;HashTablestring, int ht;for (auto e : arr){//auto ret ht.Find(e);HashNodestring, int* ret ht.Find(e);if (ret){ret-_val.second;}else{ht.Insert(make_pair(e, 1));}}ht.Print2();ht.Insert(make_pair(apple, 1));ht.Insert(make_pair(sort, 1));ht.Insert(make_pair(abc, 1));ht.Insert(make_pair(acb, 1));ht.Insert(make_pair(aad, 1));ht.Print2();}void Some(){const size_t N 100;vectorint v;v.reserve(N);srand(time(0));for (size_t i 0; i N; i){//v.push_back(rand()); // N比较大时重复值比较多v.push_back(rand()%100i); // 重复值相对少//v.push_back(i); // 没有重复有序}HashTableint, int ht;for (auto e : v){ht.Insert(make_pair(e, e));}ht.Print1();}小结 今日的分享就到这里啦后续将会向你带来位图与布隆过滤器的知识如果本文存在疏漏或错误的地方还请您能够指出另外如果你存在疑问也可以评论留言哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文网站建设中模板可以做图的网站

澳门服务器是指位于澳门的服务器,具有以下特点: 地理位置优越:澳门位于珠江口西侧,靠近香港,是中国内地与香港、澳门地区重要的交通枢纽。澳门服务器因此在访问速度和延迟方面表现出色。 稳定的网络连接:澳门拥有完善的网络基础设施,包括高速稳定的互联网连接和先进的通信技术…

asp与sql做网站让人做网站需要注意什么

小波分析是近30年来发展起来的数学分支,是Fourier分析划时代发展的结果,由法国工程师Morlet首先提出,后广泛应用于信号处理、图像处理与分析、地震勘探、故障诊断、自动控制等领域,小波就是小的波形,所谓“小”是指它具…

网站推广工具有企业服务包括哪些

linux内核的裁剪和移植具体都在这个网址里面。https://blog.csdn.net/xie0812/article/details/10816059https://blog.csdn.net/xie0812/article/details/10821779转载于:https://blog.51cto.com/13401435/2145947

如何选择网站建设无极网络

看题: 我们令f[i][j]为前i个物品放满容量为j的背包的最大价值。 f[i][j]max(f[i-1][j],f[i-1][j-c[i]]w[i]); 我们开始全副成负无穷。f[0][0]0;最后循环最后一行求max; 负无穷:0xc0c0c0c0;正无穷:0x3f3f3f3f 下面是v12,n6的图示&#xff…

网站建设的要求有哪些泉州建设部网站

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本,一种…

网站建设视频下载营销网络分布图

一、分析 分析过程网上有很多,这里只说个大概,主要是提供golang源码 请求网站,发现前两次请求都会返回521,第三次请求成功,说明前两次请求肯定是干了什么事情;使用接口请求工具模拟请求分析该过程 使用postman工具请求 a. 第一次请求会在响应头返回jsluid,返回内容中拼接…

自己的网站是什么样子的塘厦镇做网站

导读: 除了语文数学这种常规科目,最让家长们焦虑的就是英语。现在的孩子,英语启蒙都很早,但是对英语的兴趣总是开始还可以,越往后越没动力和兴趣,稍微遇到点挫折就不想坚持了。钱也花了,好老师也…

遵义做什么网站好青海wap网站建设比较好

前言 “绿水青山就是金山银山”,水利环境一直是国际生态部门关注的重点。随着经济的发展、针对水利环境的监管也日趋严格,尤其是重点河、湖水系、水源地、城市内河等成为重点监管对象,监管力度也愈来愈严格,监测布点密度不断加大。…

搭建网站首页做长尾词优化去哪些网站

Spring帝国 Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验。在现代企业级应用架构中,Spring技术栈几乎成为了Java语言的代名词,那么Sp…

建设企业网站需要哪些东西广西壮族自治区住房和城乡建设厅网站

完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮…

甘肃建设厅网站官网微餐饮网站建设平台

文章目录 设计模式概述创建型模式:结构型模式:行为型模式: 设计模式概述 设计模式是什么? 设计模式的一般定义为: 设计模式(Design Pattern)是一套反复使用、多人知晓的,经过分类…

佛山网站建设价格多少敬请期待的文案

1. 简单说下你对并发和并行的理解? 2. 同步、异步、阻塞、非阻塞的概念 3. 进程和线程的基本概念 4. 进程与线程的区别? 5. 为什么有了进程,还要有线程呢? 6. 进程的状态转换 7. 进程间的通信方式有哪些? 8. 进程的调度…

做网站排版用什么软件广州增城做网站

1.,首先看ec待机条件: 待机供电,32k时钟,复位,适配器检测,开关信号。但是视频居然是找适配器的接口,跟着视频走,所以我先找打了适配器接口j24。vint20为公共点,我查了vint20的所有接线发现没有小…

深圳网站设计招聘信息网站设计自己申请

处理数据之前的pre-process 观察下载的数据文件train.csv train.csv只有每个月前20天的数据,另外每个月剩下10天数据用于作业结果评估,对学生不可见 观察数据发现rainfall栏有很多NR表示没有降雨,但是我们只需要数字,因此可以使用…

百度广告投放东莞seo建站优化公司

1、我们在linux上简单看路由信息使用下面命令 route -n

广州手机网站建设报价表跨境电商流程

所谓变量,就是用字母、数字和下划线组成的一个标识符。 按照数据类型的不同,变量可以分为标准类型和用户自定义类型。其中标准类型包括布尔型 ( BOOL )、整型( INT )、实型( REAL &#xff09…

网站怎么做组织图自己怎么做网址

在 MIP 推出后,我们收到了一些站长的疑问。现将常见问题整理出来,帮助大家了解 MIP 的知识。 一、MIP 认知类问题二、改造前准备三、前端改造,组件使用四、提交生效五、MIPCache六、更多学习资源 一、MIP 认知类问题 1.1 MIP 化的收益是什…

莆田网站建设方法如何做网站教学

1.主线程退出其他线程不退出,主线程应调用pthread_exit; 2.避免僵尸线程:pthread_join、pthread_detach、pthread_create指定分离属性。被join线程可能在join函数返回前就释放完自己的所有内存资源,所以不应当返回被回收线程栈中…

discuz做淘客网站为什么做美妆网站

场景: 移动端h5中,当我们需要在地图中展示很多marker点坐标的时候,通常会使用 bm-marker ,去循环生成marker点,在数量不多的情况下是没问题的,但是随着数据量的增加,地图就会变得卡顿,以及渲染延…

个人网站怎么做扫码支付福田瑞沃e3自卸车

当您看到本文标题时,不禁感叹,总算是到了训练模型这一节了。 是啊,在之前的文章中,我们对数据进行了探索,以及对一个训练集和一个测试集进行了采样,也编写了一个预处理管道来自动清理,准备您的数…