数据结构6

 一、哈希散列--通讯录查找

#include "hash.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//int *a[10];int hash_function(char key)
{if (key >= 'a' && key <= 'z'){return key - 'a';}else if (key >= 'A' && key <= 'Z'){return key - 'A';}else{return HASH_TABLE_MAX_SIZE-1;}
}int insert_hash_table(Hash_node **hash_table, Data_type data)
{int addr = hash_function(data.name[0]);	Hash_node *pnode = malloc(sizeof(Hash_node));if (NULL == pnode){printf("fail malloc\n");return -1;}pnode->data = data;pnode->pnext = NULL;
/*pnode->pnext = hash_table[addr]; //pheadhash_table[addr] = pnode;
*/if (NULL == hash_table[addr]){hash_table[addr] = pnode;}else if (strcmp(hash_table[addr]->data.name, data.name) >= 0){pnode->pnext = hash_table[addr];hash_table[addr] = pnode;}else{Hash_node *p = hash_table[addr];while (p->pnext != NULL && strcmp(p->pnext->data.name, pnode->data.name) < 0){p = p->pnext;}pnode->pnext = p->pnext;p->pnext = pnode;}return 0;
}void hash_table_for_each(Hash_node **hash_table)
{for (int i = 0; i < HASH_TABLE_MAX_SIZE; i++){Hash_node *p = hash_table[i];while (p != NULL){printf("%s: %s\n", p->data.name, p->data.tel);p = p->pnext;}printf("\n");}
}Hash_node *find_hash_by_name(Hash_node **hash_table, char *name)
{int addr = hash_function(name[0]);Hash_node *p = hash_table[addr];while (p){if (0 == strcmp(p->data.name, name)){return p;}p = p->pnext;}return NULL;
}void destroy_hash_table(Hash_node **hash_table)
{for (int i = 0; i < HASH_TABLE_MAX_SIZE; i++){Hash_node *p = hash_table[i];while (p != NULL){hash_table[i] = p->pnext;free(p);p = hash_table[i];}}
}

二、前情回顾

顺序表:数组
链式表:

单向链表

双向链表

循环链表

内核链表

栈:

顺序栈

链式栈

队列:

顺序队列、循环队列

链式队列

散列结构:哈希表:

三、树型结构

        1.定义(一对多):

        树:由n个节点组成的有限集有一个根节点;其他节点只有一个前驱节点,但可以有多个后继节点。

        根:无前驱,有后继n=0,空树

                叶子结点(终端结点):有前驱结点、无后继结点

                分支结点(非终端结点):有前驱结点,有后继结点

        度:

                深度:树的层数

                广度:树中最大结点的度就是树的广度

                        结点的度:当前结点的后继结点个数

        二叉树:树的度为二,且左右子树不可交换位置

                      满二叉树:在不增加层数的前提下,无法再增加一个结点

                      满二叉树第K层结点个数:2^(K-1)

                      K层满二叉树结点总个数:2^K-1

                      完全二叉树:在满二叉树的前提下,增加数据只能从上到下、从左至右;

                                                                                删除数据只能从下至上,从右向左。

                                满二叉树->完全二叉树

                                完全二叉树 !-> 满二叉树

        2.遍历

                (广度优先遍历算法)

                前序遍历:根左右

                中序遍历:左根右

                后序遍历:左右根

                (深度优先遍历算法)

                 层遍历:从上到下,从左到右,逐层遍历

        *已知前序+中序才能还原出唯一的二叉树

#include "tree.h"
#include <stdio.h>
#include <stdlib.h>#include "queue.h"BTData_type tree[] = {"ABEH##M##F##DI#C##G##"};int idx = 0;
Tree_node *create_bintree()
{BTData_type data = tree[idx++];if ('#' == data){return NULL;}Tree_node *pnode = malloc(sizeof(Tree_node));if (NULL == pnode){printf("fail malloc\n");return NULL;}pnode->data = data;pnode->pl = create_bintree();pnode->pr = create_bintree();return pnode;
}void pre_order(Tree_node *proot)
{if (NULL == proot){return;}printf("%c", proot->data);pre_order(proot->pl);pre_order(proot->pr);
}void mid_order(Tree_node *proot)
{if (NULL == proot){return ;}mid_order(proot->pl);printf("%c", proot->data);mid_order(proot->pr);
}void pos_order(Tree_node *proot)
{if (NULL == proot){return ;}pos_order(proot->pl);pos_order(proot->pr);printf("%c", proot->data);
}int get_tree_node_cnt(Tree_node *proot)
{if (NULL == proot){return 0;}return 1 + get_tree_node_cnt(proot->pl)+get_tree_node_cnt(proot->pr);
}int get_tree_layer_cnt(Tree_node *proot)
{if (NULL == proot){return 0;}int cntl = get_tree_layer_cnt(proot->pl);int cntr = get_tree_layer_cnt(proot->pr);return cntl > cntr ? cntl+1 : cntr+1;}void destroy_tree(Tree_node **pproot)
{if (NULL == *pproot){return ;}destroy_tree(&((*pproot)->pl));destroy_tree(&((*pproot)->pr));free(*pproot);*pproot = NULL;
}void layer_order(Tree_node *proot)
{Queue *pque = create_queue();if (NULL == pque){return ;}Data_type outdata;enter_queue(pque, proot);while (!is_empty_queue(pque)){out_queue(pque, &outdata);printf("%c", outdata->data);if (outdata->pl != NULL){enter_queue(pque, outdata->pl);}if (outdata->pr != NULL){enter_queue(pque, outdata->pr);}}destroy_queue(&pque);
}

四、算法:解决特定问题的求解步骤

衡量算法:
算法的设计,
1.正确性.
        语法正确
        合法的输入能得到合理的结果。
        对非法的输入,给出满足要求的规格说明
        对精心选择,甚至习难的测试都能正常运行,结果正确

2.可读性,便于交流,阅读,理解高内聚 低耦合

3.健壮性,输入非法数据,能进行相应的处理,而不是产生异常
4.高效率(时间复杂度)

        时间复杂度:数据增长量与处理时间的关系

        时间复杂度的计算规则
                        1,用常数1 取代运行时间中的所有加法常数

                        2、在修改后的运行医数中,只保留最高阶项

                        3、如果最高阶存在且系数不是1,则去除这个项相乘的常/数。

排序算法:
1. 思想
2. 代码
3. 时间复杂度
4. 排序算法的稳定性:对于两个相同的数据,经过排序,两个相同数据的相对位置没有
                                          发生变化,这就是一个稳定的排序算法。


冒泡排序:相邻两两比较,优先排好最大值

for(i=len-1;i>0;--i)
{for(j=0;j<i;++j){if(a[i]>a[j]){swap(a[i],a[j]);   }}
}

                      时间复杂度:O(n^2)
                      稳定性:稳定
                    
        

选择排序:将待排位置的数据和后续的数据依次进行比较,将小的存放在待排位置,
                       经过一趟,优先排好最小值。
         

              for(int i = 0; i < len-1; i++){for (int j = i+1,; j < len; j++){if (a[i] > a[j])swap(a[i], a[j]);}}


                    时间复杂度:O(n^2)
                    稳定性:不稳定
                        

插入排序: 将待排的元素,依次插入到一个有序序列中,确保插入后任然有序。
                       
 

                       for (int i = 1; i < len; i++){j = i;int temp = a[i];while (j > 0 && a[j-1] > temp){a[j] = a[j-1];--j;}  a[j] = temp;}


                         时间复杂度:O(n^2)
                        稳定性:稳定
                       
快速排序:选定基准值,从两头分别和基准值比较,比基准值大的向后,比基准值小的向前,优先排好基准值。


void Qsort(int *begin, int *end)
{int *p = begin;int *q = end;if(begin >= end){return ;}int t = *begin;while(p < q){while(p < q && *q >= t){--q;}while(p < q && *p <= t){++p;}swap(p, q);}swap(begin, p);Qsort(begin, p - 1);Qsort(p + 1, end);}


                      时间复杂度:O(nlogn)             
                      稳定性:不稳定

希尔排序:将待排的序列,按照增量分成若干个子系列,对子序列进行插入排序。

void shell_sort(int *a, int len)
{int j = 0;for (int inc = len/2; inc > 0; inc /=2){for (int i = inc; i < len; i++){j = i;int tmp = a[i];while (j >= inc && a[j-inc] > tmp){a[j] = a[j-inc];j = j-inc;}a[j] = tmp;}}
}

                       时间复杂度:O(nlogn)-O(n^2) 
                        稳定性:不稳定
二分查找:
                   前提:有序的序列

int BinaryFind(int a[],int len,int n){int begin=0;int end=len-1;int mid;while(begin<=end){mid=(begin+end)/2;if(n<a[mid]){end=mid-1;}else if(n>a[mid]){begin=mid+1;}else{break;}     }if(begin<=end){return mid;}else{return -1;}                                                                       }


                   时间复杂度:O(logn)

5.低存储(空间复杂度)

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

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

相关文章

Java 大视界 -- 全球数据治理格局下 Java 大数据的发展路径(89)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

基于CanMV IDE 开发软件对K210图像识别模块的开发

简介 CanMV IDE 是一款专为 K210 芯片设计的图形识别 Python 软件&#xff0c;它提供了强大的功能&#xff0c;帮助开发者轻松实现基于 K210 芯片的图形识别应用。无论你是初学者还是经验丰富的开发者&#xff0c;CanMV IDE 都能为你提供便捷的开发环境和丰富的资源。 硬件资…

Unity学习part3

此为b站视频【【Unity教程】零基础带你从小白到超神】 https://www.bilibili.com/video/BV1gQ4y1e7SS/?p55&share_sourcecopy_web&vd_source6e7a3cbb802eb986578ad26fae1eeaab的笔记 1、反向动力学 打开ik处理 public class PlayerMoveController : MonoBehaviour {…

STM32——HAL库开发笔记19(串口中断接收实验)(参考来源:b站铁头山羊)

本实验&#xff0c;我们以中断的方式使得串口发送数据控制LED的闪烁速度&#xff0c;发送1&#xff0c;慢闪&#xff1b;发送2&#xff0c;速度正常&#xff1b;发送3&#xff0c;快闪。 一、电路连接图 二、实现思路&CubeMx配置 1、实现控制LED的闪烁速度 uint32_t bli…

Golang关于结构体组合赋值的问题

现在有一个结构体&#xff0c;其中一个属性组合了另外一个结构体&#xff0c;如下所示&#xff1a; type User struct {Id int64Name stringAge int64UserInfo }type UserInfo struct {Phone stringAddress string }如果要给 User 结构体的 Phone 和 Address 赋值的话&am…

更高效实用 vscode 的常用设置

VSCode 可以说是文本编辑神器, 不止程序员使用, 普通人用其作为文本编辑工具, 更是效率翻倍. 这里分享博主对于 VSCode 的好用设置, 让 VSCode 如虎添翼 进入设置 首先进入设置界面, 后续都在这里进行配置修改 具体设置 每项配置通过搜索关键字, 来快速定位配置项 自动保存…

深度学习之卷积神经网络框架模型搭建

卷积神经网络框架模型搭建 目录 卷积神经网络框架模型搭建1 卷积神经网络模型1.1 卷积神经网络1.2 卷积层&#xff08;Convolutional Layer&#xff09;1.2.1 输出特征图 1.3 激活函数1.4 池化层&#xff08;Pooling Layer&#xff09;1.5 全连接层&#xff08;Fully Connected…

【深度强化学习】Actor-Critic 算法

本书之前的章节讲解了基于值函数的方法&#xff08;DQN&#xff09;和基于策略的方法&#xff08;REINFORCE&#xff09;&#xff0c;其中基于值函数的方法只学习一个价值函数&#xff0c;而基于策略的方法只学习一个策略函数。那么&#xff0c;一个很自然的问题是&#xff0c;…

数据结构——二叉树(2025.2.12)

目录 一、树 1.定义 &#xff08;1&#xff09;树的构成 &#xff08;2&#xff09;度 2.二叉树 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;二叉树的遍历 &#xff08;3&#xff09;遍历特性 二、练习 1.二叉树 &#xff08;1&#xff09;创建二叉树…

安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率

安科瑞 华楠 18706163979 在当今大力发展清洁能源的时代背景下&#xff0c;光伏发电作为一种可持续的能源解决方案&#xff0c; 正得到越来越广泛的应用。然而&#xff0c;光伏发电过程中出现的逆流问题&#xff0c;给电网的安全稳定 运行带来了诸多挑战。若不能有效解决&…

3、树莓派5 安装VNC查看器 开启VNC服务器

在前序文章中&#xff08; 2、树莓派5第一次开机&#xff09;&#xff0c;可以使用三种方式开机&#xff0c;其中使用网线及wifi的方式均需要使用到VNC查看器进行远程桌面控制&#xff0c;本文将介绍如何下载安装并配置及使用VNC查看器及服务器&#xff0c;对前序文章做一些补充…

牛客周赛 Round 80

前言 这场比赛是很有意思的&#xff0c;紧跟时事IG杯&#xff0c;大卞"神之举手"&#xff0c;0胜拿下比赛&#xff0c;我当时也是完整的看完三场比赛&#xff0c;在第二次说直接两次罚下的时候我真是直接暴起了&#xff0c;然后第三场当时我正在吃饭&#xff0c;看到…

文档格式转换引擎开发:支持PDF与OFD的技术实现

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 近年来&#xff0c;中国在信息技术领域持续追求自主创新和供应链安全&#xff0c;伴随信创上升为国家战略&#xff0c;一些行业也开始明确要求文件导出的格式必须为 OFD 格式。OF…

VSCode Error Lens插件介绍(代码静态检查与提示工具)(vscode插件)

文章目录 VSCode Error Lens 插件介绍**功能概述****开发背景****使用方法****适用场景** VSCode Error Lens 插件介绍 功能概述 Error Lens 是一款增强 VS Code 错误提示的扩展工具&#xff0c;通过 内联显示错误和警告信息&#xff0c;直接定位代码问题&#xff0c;提升开发…

快速幂(算法)的原理

快速幂算法 快速幂数学原理算法实现OJ题展示不用高精度计算二进制指数的高精度计算数学题等差数列和等比数列计数原理 快速幂 求 ( a b ) % n (a^b)\%n (ab)%n的结果&#xff08;即 a a a的 b b b次方&#xff0c;再除以 n n n得到的余数&#xff09;。 利用程序求解时&#…

无人机遥感在农林信息提取中的实现方法与GIS融合应用

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley&#xff1a; 功能 基于HttpUrlConnection;封装了UIL图片加载框架&#xff0c;支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动&#xff08;Activity结束生命周期同时取消所有网络请求 …

【油猴脚本/Tampermonkey】DeepSeek 服务器繁忙无限重试(20250214优化)

目录 一、 引言 二、 逻辑 三、 源代码 四、 添加新脚本 五、 使用 六、 BUG 七、 优化日志 1.获取最后消息内容报错 2.对话框切换无法正常使用 一、 引言 deepseek演都不演了&#xff0c;每次第一次提问就正常&#xff0c;后面就开始繁忙了&#xff0c;有一点阴招全…

C++ Primer 函数重载

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【c++初阶】类和对象②默认成员函数以及运算符重载初识

目录 ​编辑 默认成员函数&#xff1a; 构造函数 构造函数的特性&#xff1a; 析构函数&#xff1a; 拷贝构造函数&#xff1a; 1. 拷贝构造函数是构造函数的一个重载形式。 2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用&#xff0c;使用传值方式编译器直接报…