《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找

2023-11-01

《数据结构与算法》实验和课程Github资源  

《数据结构与算法》实验:线性结构及其应用——算术表达式求值

《数据结构与算法》实验:树型结构的建立与遍历

《数据结构与算法》实验:图结构的建立与搜索

《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找

《数据结构与算法》实验:排序算法实验比较——选择排序 & 堆排序

《数据结构与算法》实验报告

学生姓名

郭茁宁

院(系)

计算机科学与技术

  

1183710109

 

软件工程

实验时间

2019年12月20日(周五)

实验地点

格物213室

实验项目

实验4/5查找结构的实验比较(3学时)

实验目的:将课程的基本原理、技术和方法与实际应用相结合,训练和提高学生组织、存储和处理信息的能力,以及复杂问题的数据结构设计能力和程序设计能力,培养软件设计与开发所需要的实践能力。

实验要求:灵活运用基本的数据结构和算法知识,对实际问题进行分析和抽象;结合程序设计的一般过程和方法为实际问题设计数据结构和有效算法;用高级语言对数据结构和算法进行编程实现、调试,测试其正确性和有效性。

实验内容:BST查找结构与折半查找方法的实现与实验比较

   本实验要求编写程序实现BST 存储结构的建立(插入)、删除、查找和排序算法;实现折半查找算法;比较BST查找结构与折半查找的时间性能。

1. 设计BST 的左右链存储结构,并实现BST插入(建立)、删除、查找和排序算法。

2. 实现折半查找算法。

3. 实验比较:设计并产生实验测试数据,考察比较两种查找方法的时间性能,并与理论结果进行比较。以下具体做法可作为参考:

(1)第1组测试数据: n=1024个已排序的整数序列(如0至2048之间的奇数);第2组测试数据:第1组测试数据的随机序列。

(2)按上述两组序列的顺序作为输入顺序,分别建立BST。

(3)编写程序计算所建的两棵BST的查找成功和查找失败的平均查找长度(主要是改造Search算法,对“比较”进行计数),并与理论结果比较。

(4)以上述BST的中序遍历序列作为折半查找的输入,编写程序分别计算折半查找的查找成功和查找失败的平均查找长度,并与理论结果比较。

(5)以上实验能否说明:就平均性能而言,BST的查找与折半查找差不多,为什么?

数据结构定义:

class BSTree:二叉搜索树类,拥有add连接、sorted输出排序数列、insert插入结点、del删除结点、find_count查找并计数等成员函数;

算法设计与分析(要求画出核心内容的程序流程图):

  1. BST插入(建立)

读入n个数后建立一棵二叉搜索树,即把n个数不断插入到已有(一开始是空树)。插入操作:

 

 

  1. BST删除

每读入一个要删除的数,就先找到该点,判断是如下哪种类型:

    1. 左右儿子都为空:删除该点,并将其父亲的对应儿子指针指向空;
    2. 左儿子为空:删除该点,该点右儿子变为该点父亲的对应新儿子;
    3. 右儿子为空:删除该点,该点左儿子变为该点父亲的对应新儿子;
    4. 左右儿子都不为空:该点左儿子的最右儿子的的左儿子代替其位置,其值代替删除点的值;
  1. BST查找

int find_count(int valueint cnt)

{

    if (value == this->val) return cnt;

    return value < val ? (son[0== NULL ? -cnt : son[0]->find_count(value, cnt + 1)) : (son[1== NULL ? -cnt : son[1]->find_count(value, cnt + 1));

}

 

  1. BST排序

void sorted() // 打印中序遍历,排序结果

{

    if (son[0!= NULL) son[0]->sorted();

    printf("%-4d", val);

    if (son[1!= NULL) son[1]->sorted();

}

  1. 折半查找

int Half_Search(int xint nint a[]) // 折半查找

{

    int l = 1, r = n, mid, length = 1;

    bool flag = false;

    while (l <= r)

    {

        mid = (l + r) / 2;

        if (x == a[mid])

        {

            flag = true;

            break;

        }

        (x < a[mid]) ? r = mid - 1 : l = mid + 1;

        length++;

    }

    return flag ? length : -length;

}

  1. 记录平均查找成功/失败长度

int find_count(int valueint cnt)

{

    if (value == this->val) return cnt;

    return value < val ? (son[0== NULL ? -cnt : son[0]->find_count(value, cnt + 1)) : (son[1== NULL ? -cnt : son[1]->find_count(value, cnt + 1));

}

int Half_Search(int xint nint a[]) // 折半查找

{

    int l = 1, r = n, mid, length = 0;

    bool flag = false;

    while (l <= r)

    {

        length++;

        mid = (l + r) / 2;

        if (x == a[mid])

        {

            flag = true;

            break;

        }

        (x < a[mid]) ? r = mid - 1 : l = mid + 1;

    }

    return flag ? length : -length;

}

在比较中记录次数

length > 0 ? (tree_succ_times += 1, tree_succ_length += length) : (tree_fail_times += 1, tree_fail_length += length);

printf("Success: %10d %8.3lf\n", tree_succ_times, 1.0 * tree_succ_length / tree_succ_times);

printf("Failure: %10d %8.3lf\n", tree_fail_times, 1.0 * tree_fail_length / tree_fail_times);

length > 0 ? (half_succ_times += 1, half_succ_length += length) : (half_fail_times += 1, half_fail_length += length);

printf("Success: %10d %8.3lf\n", half_succ_times, 1.0 * half_succ_length / half_succ_times);

printf("Failure: %10d %8.3lf\n", half_fail_times, 1.0 * half_fail_length / half_fail_times);

输出平均查找长度

  1. 比较性能

通过计算1亿次查找的成功/失败查找长度/用时,比较性能

sta = clock();

    for (int i = 1, x; i <= m; i++)

{

    ……

    }

    end = clock();

printf("It takes %.4lfs totally, %.6lfus per cmp.\n", (double)(end - sta) / CLOCKS_PER_SEC, 1000.0 * (double)(end - sta) / (tree_succ_length - tree_fail_length));

 

 

实验测试结果及结果分析:

 

Tree:

Success:   49999971   12.490

Failure:   50000029  -13.480

It takes 12.5780s totally, 0.009687us per cmp. 

 

Half:

Success:   49999912    9.012

Failure:   50000088  -11.002

It takes 11.7700s totally, 0.011762us per cmp. 

 

可以看出:

  1. 二叉搜索树中平均成功查找长度为12.490,平均失败查找长度为13.480
  2. 二叉搜索树1亿次查找用时共12.5780秒,平均每次比较用时0.009687微秒
  3. 折半查找中平均成功查找长度为9.012,平均失败查找长度为11.002
  4. 折半查找1亿次查找用时共11.7700秒,平均每次比较用时0.011762秒

 

结论:

  1. 折半查找总的效率高于二叉搜索树,包括查找长度和用时;
  2. 查找过程中的单次比较,二叉搜索树的用时比折半查找要短;
  3. 总体来说,折半查找性能更优,因为它相对于二叉搜索树更为平衡;

问题及解决方法:

  1. 二叉搜索树中删除操作,取左边最右儿子,能删除但不够完美;
  2. 折半查找中计算查找次数,在每次比较前计数,符合定义;
  3. 比较二叉搜索树(指针)和折半查找(数组)的效率,需要计算每次比较的时间,而不是总的时间;

源程序名称:lab4.cpp

注意:正文文字为宋体小4号,图中文字为宋体5号。行距为多倍行距1.25。

      源程序与此报告打包提交,压缩包采用学号命名。

// lab4.cpp

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
using namespace std;
#define Child_Num 2
#define N 142857
#define MAX 0x7fffffff

class BSTree // 小于:左子树   大于:右子树
{
public:
    int val, LD, RD, BF;
    BSTree *son[Child_Num], *fa;
    BSTree()
    {
        for (int i = 0; i < Child_Num; i++) son[i] = NULL;
        fa = NULL;
        BF = LD = RD = 0;
    }
    void add(BSTree *child, int child_num)
    {
        son[child_num] = child;
        child->fa = this;
    }
    void sorted() // 打印中序遍历,排序结果
    {
        if (son[0] != NULL) son[0]->sorted();
        printf("%-4d", val);
        if (son[1] != NULL) son[1]->sorted();
    }
    bool leaf() { return this == NULL ? false : son[0] == NULL && son[1] == NULL; }
    int height() { return max(LD, RD); }
    void calcBF()
    {
        if (this->leaf()) { return; }
        else
        {
            if (son[0] != NULL) son[0]->calcBF(), LD = son[0]->height() + 1;
            if (son[1] != NULL) son[1]->calcBF(), RD = son[1]->height() + 1;
        }
        this->BF = LD - RD;
    }
    void insert(BSTree **head)
    {
        if (*head == NULL)
        {
            *head = this;
            return;
        }
        for (BSTree *f1 = *head, *f2 = f1; f1 != NULL; f2 = f1)
        {
            f1 = this->val <= f1->val ? f1->son[0] : f1->son[1];
            if (f1 == NULL) f2->add(this, this->val <= f2->val ? 0 : 1);
        }
    }
    void del(BSTree **head)
    {
        if (son[0] == NULL && son[1] == NULL)
        {
            fa->son[0] == this ? fa->son[0] = NULL : fa->son[1] = NULL;
            delete this;
            return;
        }
        else if (son[0] != NULL && son[1] != NULL) // 左儿子最右
        {
            BSTree *x = son[0];
            while (x->son[1] != NULL) x = x->son[1];
            this->val = x->val;
            if (x == son[0] && x->son[0] != NULL) { add(x->son[0], 0); }
            else
                x->fa->son[1] = x->son[0];
            delete x;
        }
        else
        {
            if (son[1] == NULL) // 右子树为空
            {
                if (fa != NULL) { fa->add(son[0], this == fa->son[0] ? 0 : 1); }
                else
                {
                    son[0]->fa = NULL;
                    *head = son[0];
                }
            }
            else if (son[0] == NULL) // 左子树为空
            {
                if (fa != NULL) { fa->add(son[1], this == fa->son[0] ? 0 : 1); }
                else
                {
                    son[1]->fa = NULL;
                    *head = son[1];
                }
            }
            delete this;
        }
    }
    int find_count(int value, int cnt)
    {
        if (value == this->val) return cnt;
        return value < val ? (son[0] == NULL ? -cnt : son[0]->find_count(value, cnt + 1)) : (son[1] == NULL ? -cnt : son[1]->find_count(value, cnt + 1));
    }
};

void Delete(BSTree *arr[], BSTree **head) // 删除节点
{
    int m;
    scanf("%d", &m);
    for (int i = 1, x; i <= m; i++)
    {
        scanf("%d", &x);
        if (!arr[x])
        {
            printf("None\n");
            continue;
        }
        arr[x]->del(head);
        (*head)->sorted();
        cout << endl;
    }
}

int Half_Search(int x, int n, int a[]) // 折半查找
{
    int l = 1, r = n, mid, length = 1;
    bool flag = false;
    while (l <= r)
    {
        mid = (l + r) / 2;
        if (x == a[mid])
        {
            flag = true;
            break;
        }
        (x < a[mid]) ? r = mid - 1 : l = mid + 1;
        length++;
    }
    return flag ? length : -length;
}

void Search(BSTree *head, int n, int a[]) // 查找节点
{
    clock_t sta, end;
    int m;
    int tree_succ_times = 0, tree_succ_length = 0, tree_fail_times = 0, tree_fail_length = 0;
    int half_succ_times = 0, half_succ_length = 0, half_fail_times = 0, half_fail_length = 0;
    scanf("%d", &m);

    cout << endl;

    sta = clock();
    for (int i = 1, x; i <= m; i++)
    {
        //srand((int)time(0));
        x = rand() % 2048 + 1;
        int length = head->find_count(x, 1);
        length > 0 ? (tree_succ_times += 1, tree_succ_length += length) : (tree_fail_times += 1, tree_fail_length += length);
    }
    end = clock();
    cout << "Tree:" << endl;
    printf("Success: %10d %8.3lf\n", tree_succ_times, 1.0 * tree_succ_length / tree_succ_times);
    printf("Failure: %10d %8.3lf\n", tree_fail_times, 1.0 * tree_fail_length / tree_fail_times);
    printf("It takes %.4lfs totally, %.6lfus per cmp.\n", (double)(end - sta) / CLOCKS_PER_SEC, 1000.0 * (double)(end - sta) / (tree_succ_length - tree_fail_length));

    cout << endl;

    sta = clock();
    for (int i = 1, x; i <= m; i++)
    {
        //srand((int)time(0));
        x = rand() % 2048 + 1;
        int length = Half_Search(x, n, a);
        length > 0 ? (half_succ_times += 1, half_succ_length += length) : (half_fail_times += 1, half_fail_length += length);
    }
    end = clock();
    cout << "Half:" << endl;
    printf("Success: %10d %8.3lf\n", half_succ_times, 1.0 * half_succ_length / half_succ_times);
    printf("Failure: %10d %8.3lf\n", half_fail_times, 1.0 * half_fail_length / half_fail_times);
    printf("It takes %.4lfs totally, %.6lfus per cmp.\n", (double)(end - sta) / CLOCKS_PER_SEC, 1000.0 * (double)(end - sta) / (half_succ_length - half_fail_length));

    cout << endl;
}

int main()
{
    freopen("init.txt", "r", stdin);
    int n, a[N];
    BSTree *arr[N], *head = NULL, *t;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        t = new BSTree();
        arr[a[i]] = t;
        t->val = a[i];
        t->insert(&head);
    }
    head->calcBF();
    sort(a + 1, a + n + 1);

    //Delete(arr, &head);
    Search(head, n, a);

    fclose(stdin);
    return 0;
}

 

// create_data.cpp

#include <cstdio>
#include <cstdlib>
#define N 1024
#define M 2048
bool f[M + 5];
int main()
{
    freopen("data.txt", "w", stdout);
    printf("%d\n", N);
    for (int i = 1; i <= N; i++)
    {
        int x = rand() % M + 1;
        if (!f[x] && x % 2 != 0)
        {
            printf("%d ", x);
            f[x] = true;
        }
        else
            i--;
    }
    fclose(stdout);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找 的相关文章

  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • openai Python库

    OpenAI 是一个人工智能研究机构 他们开发了一个 Python 库 用于帮助开发者使用人工智能技术 这个库包含了许多用于自然语言处理 机器学习 深度学习和其他人工智能应用的工具和算法 您可以在 OpenAI 的 GitHub 页面上找到
  • Mysql连接问题

    连接MySQL长时间不连接后报错 com mysql cj core exceptions ConnectionIsClosedException No operations allowed after connection closed
  • eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP

    eNSP模拟无线AC和AP 1 拓扑 2 需求 实现AC和AP二层关联 3 配置 dhcp enable interface Vlanif 1 ip address 192 168 10 1 255 255 255 0 dhcp selec
  • MySql 字符串数据类型

    字符串类型 CHAR CHAR类型是定长的 会根据定义的长度分配空间 当存储CHAR值时 mysql会删除所有的末尾空格 CHAR很适合存储很短的字符串 或者所有的值都接近同一个长度 例如 CHAR非常适合存储密码的MD5的值 因为这是一个
  • Java毕设 SSM中药店商城系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最新完成的毕业设计项
  • id 重启event_系统已在未先正常关机的情况下重新启动 事件ID:41

    创建日期 2018 07 18 系统已在未先正常关机的情况下重新启动 事件ID 41 日志名称 System 来源 Microsoft Windows Kernel Power 日期 2018 7 17 23 55 06 事件 ID 41
  • do...while(0)的妙用

    在C 中 有三种类型的循环语句 for while 和do while 但是在一般应用中作循环时 我们可能用for和while要多一些 do while相对不受重视 但是 最近在读我们项目的代码时 却发现了do while的一些十分聪明的用
  • Km Kcat Kcat/Km

    max 是指 最大反应速度 当 底物浓度 足够大时 体系中 酶的活性中心达到饱和状态 其反应速度达到最大 由此可见 最大反应速度 max 随 酶浓度的变化而变化 kcat 指反应常数 catalytic constant kcat 可以由
  • python爬取小说(二)书籍基本信息爬取

    爬完数据目录和内容后 我们来爬取书籍的基本信息 在上篇博客的基础上 爬取书籍信息并存入字典 coding utf 8 import urllib request import bs4 import re import sqlite3 def
  • SpringBoot项目使用docker-maven-plugin插件构建docker镜像以及推送到docker hub或docker registry私服

    我们知道docker可将应用程序和基础设施层隔离 可更快地打包 测试以及部署应用程序 本文主要介绍SpringBoot项目如何构建docker镜像以及推送到私服或者docker hub服务器上 本文介绍的方式是使用docker maven
  • JAVA 反射机制--reflection

    1 关于JAVAf 反射机制的一些基本的介绍参见好搜百科http baike haosou com doc 5458411 5696799 html或者搜索关键字 JAVAf 反射机制 2 这里总结下JAVAf 反射机制是如何运用的 或者说
  • Python零基础小白快速上手,不多废话

    Python零基础小白快速上手 Markdown编辑器和python安装 Markdown编辑器就是程序员常用的记事本 https img blog csdnimg cn 20201031151738673 png pic center 这
  • ElementUI中的 el-table 怎样格式化显示1和0为男和女

    场景 数据库中存储的是int型的1和0 从数据中取出来的也是1和0 怎样将其格式化为男和女 实现 table 表格
  • java list转换类型_java List数据转换为json类型数据

    list new ArrayList for int i 0 i lt carouselImageList size i CarouselImage a carouselImageList get i if a null a new Car
  • grafana使用

    1 面板 1 1 添加面板 add a new panel 增加一个新的统计图 add a new row 多个panel集合在一起 例如overview 1 2 Panel 2 PromQL查询语句 2 1 计算每一个样本的占比 饼图展示
  • 使用RBF(径向基函数)网络进行Python编程

    使用RBF 径向基函数 网络进行Python编程 径向基函数 RBF 网络是一种常用的神经网络模型 它在许多领域中都有广泛的应用 如模式识别 函数逼近和时间序列预测等 本文将介绍如何使用Python编程实现RBF网络 并提供相应的源代码 首
  • 详细使用sqlite3教程及打包资源

    包含编译好的unicode 多字节两种静态库 和sqlite3 h 还有我自己写的详细使用sqlite3的类 完整可用 实际项目我用过 有不对的地方还请大家批评指正 https download csdn net download qq 3
  • 推荐一款 IDEA 生成代码神器,写代码再也不用加班了

    Easycode是idea的一个插件 可以直接对数据的表生成entity controller service dao mapper 无需任何编码 简单而强大 1 安装 EasyCode 我这里的话是已经那装好了 建议大家在安装一个插件 叫
  • 2021年华为OD面试总结

    文章目录 写在前面 面试总体流程 简历筛选 线上机考 综合评测 业务面试 背景调查和HR面试 主管面试 写在前面 笔者211重点大学本科 毕业近5年 因为之前不是学python的 是近两年入了编程教培行业 所以慢慢接触到的python 然后
  • 《数据结构与算法》实验:查找结构的实验比较——二叉查找树BST & 二分(折半)查找

    数据结构与算法 实验和课程Github资源 数据结构与算法 实验 线性结构及其应用 算术表达式求值 数据结构与算法 实验 树型结构的建立与遍历 数据结构与算法 实验 图结构的建立与搜索 数据结构与算法 实验 查找结构的实验比较 二叉查找树B