[图解]建模树型结构和不变式:类建模(高阶+ )片段

2024-05-04 14:28

本文主要是介绍[图解]建模树型结构和不变式:类建模(高阶+ )片段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1137
01:16:18,150 --> 01:16:20,500
所以要么是这两个都有

1138
01:16:22,110 --> 01:16:25,420
才能够把这个方法安排在这个结点上

1139
01:16:28,010 --> 01:16:29,840
否则如果只有一个

1140
01:16:30,420 --> 01:16:31,890
那么只能安排一个

1141
01:16:32,710 --> 01:16:34,510
比如说,如果你只有父结点

1142
01:16:34,520 --> 01:16:37,310
那么查找所有父结点

1143
01:16:37,320 --> 01:16:39,110
查找直接父结点,就可以安排

1144
01:16:39,120 --> 01:16:41,530
因为这是能查的

1145
01:16:44,490 --> 01:16:48,550
而子结点这个是查不了了

1146
01:16:48,560 --> 01:16:51,160
因为你没有这个信息

1147
01:16:52,070 --> 01:16:53,350
只能通过仓储来查

1148
01:16:54,510 --> 01:16:58,950
同样,如果说你只有子结点属性

1149
01:16:58,960 --> 01:16:59,830
没有父结点

1150
01:17:00,310 --> 01:17:01,420
这个就可以查

1151
01:17:01,970 --> 01:17:07,250
这个查不了,父结点

1152
01:17:07,260 --> 01:17:08,810
只能通过仓储来查

1153
01:17:10,720 --> 01:17:14,560
这样来,怎么查

1154
01:17:14,570 --> 01:17:17,040
假设有一个也好,两个也好

1155
01:17:18,190 --> 01:17:19,460
如果有父结点

1156
01:17:19,470 --> 01:17:20,780
那么这个就是可用的

1157
01:17:20,790 --> 01:17:22,860
如果有子结点,这就是可用的

1158
01:17:23,250 --> 01:17:25,470
如果两个都有,这两个都可用

1159
01:17:28,120 --> 01:17:30,030
父结点这个,跟刚才一样的

1160
01:17:30,040 --> 01:17:31,670
只不过刚才是什么

1161
01:17:32,370 --> 01:17:34,730
这是仓储里面的递归的

1162
01:17:34,740 --> 01:17:37,780
我们这里是结点上递归,所有父结点

1163
01:17:37,790 --> 01:17:43,730
然后如果它的父结点不为空

1164
01:17:44,080 --> 01:17:48,520
这是条件,你不为空,就继续递归了

1165
01:17:49,200 --> 01:17:52,530
把这个结果添加到查询结果

1166
01:17:52,980 --> 01:17:54,940
然后这里,你看

1167
01:17:57,670 --> 01:18:00,270
针对父结点再查找所有父结点

1168
01:18:01,410 --> 01:18:01,750


1169
01:18:02,080 --> 01:18:06,820
然后把这个结果再添加到查询结果

1170
01:18:08,840 --> 01:18:10,620
AddRange实际上就是什么

1171
01:18:10,630 --> 01:18:12,020
相当于把集合

1172
01:18:12,030 --> 01:18:15,250
类似于我们

1173
01:18:16,300 --> 01:18:18,650
insert into什么

1174
01:18:19,070 --> 01:18:23,080
然后后面是select from什么

1175
01:18:23,580 --> 01:18:28,340
把一个集合插到另外一个集合里面去

1176
01:18:29,230 --> 01:18:31,140
Add是添加一个元素

1177
01:18:32,270 --> 01:18:33,510
这个添加一个集合

1178
01:18:37,200 --> 01:18:38,470
这个也是一样

1179
01:18:38,600 --> 01:18:43,150
如果子结点,递归查找子结点

1180
01:18:45,290 --> 01:18:49,700
跟刚才那个一样

1181
01:18:50,470 --> 01:18:52,300
这个也是添加集合

1182
01:18:52,670 --> 01:18:54,580
针对每一个结点来添加

1183
01:18:54,710 --> 01:18:56,810
一样的

1184
01:18:57,870 --> 01:18:59,500
我们来看一下

1185
01:19:00,810 --> 01:19:05,360
把方法放在结点上来查找的代码

1186
01:19:08,350 --> 01:19:10,230
这里,查找所有父结点

1187
01:19:10,680 --> 01:19:12,360
查找所有子结点,这里

1188
01:19:12,740 --> 01:19:18,200
然后,递归查找,在主程序这里

1189
01:19:18,210 --> 01:19:20,630
我们也,刚才使用仓储这个

1190
01:19:20,720 --> 01:19:22,270
我们把它注释掉

1191
01:19:26,120 --> 01:19:27,320
改成使用结点的

1192
01:19:27,450 --> 01:19:30,270
使用结点,你看,这里查找子结点

=============

1
00:00:00,400 --> 00:00:03,600
下一个知识点,我们来说一下不变式

2
00:00:06,990 --> 00:00:10,810
在往下讲具体的概念和细节之前

3
00:00:11,740 --> 00:00:14,430
我们还是以刚刚讲完的树

4
00:00:15,400 --> 00:00:17,660
作为我们的例子

5
00:00:17,870 --> 00:00:19,710
先举个例子

6
00:00:19,720 --> 00:00:20,790
然后再往下讲

7
00:00:22,100 --> 00:00:25,450
刚才我们讲到树形结构的建模方案

8
00:00:25,460 --> 00:00:25,770


9
00:00:26,290 --> 00:00:27,840
我们也说到树的特征

10
00:00:28,710 --> 00:00:31,900
有且只有一个没有父结点的根结点

11
00:00:34,150 --> 00:00:36,220
¥%……&我就不重复说了

12
00:00:36,230 --> 00:00:37,820
刚才已经说过很多遍了

13
00:00:39,840 --> 00:00:43,480
类图,假设我们用简单的递归

14
00:00:44,910 --> 00:00:46,020
就是右边这个类图

15
00:00:48,630 --> 00:00:54,000
这个类图,看,左边这三条

16
00:00:54,630 --> 00:00:56,540
下面这两条是可以满足的

17
00:00:57,700 --> 00:00:58,850
是可以看出来的

18
00:01:00,310 --> 00:01:04,710
但是这条满足不了

19
00:01:07,850 --> 00:01:12,750
我们可以随意设置父结点子结点

20
00:01:15,550 --> 00:01:19,740
但是没有办法实现约束

21
00:01:22,840 --> 00:01:23,430
说明什么

22
00:01:24,280 --> 00:01:28,130
光靠这个结点本身的知识是不够的

23
00:01:30,250 --> 00:01:31,730
那就需要另外一个概念

24
00:01:32,930 --> 00:01:36,990
实际上刚才我们也用了另外一个概念

25
00:01:37,000 --> 00:01:37,390


26
00:01:37,930 --> 00:01:39,330
仓储的概念

27
00:01:39,340 --> 00:01:41,500
如果说只有结点

28
00:01:42,380 --> 00:01:45,100
涉及到整个结点集合的运算的时候

29
00:01:45,110 --> 00:01:46,100
我们用的仓储

30
00:01:46,510 --> 00:01:47,850
但仓储这个概念

31
00:01:48,350 --> 00:01:51,740
实际上它不是我们核心领域的

32
00:01:51,750 --> 00:01:53,980
它也不属于哪个领域的概念

33
00:01:56,670 --> 00:02:02,080
更合理的,我们需要添加一个树的概念

34
00:02:02,090 --> 00:02:08,470
就是说,这个知识是由树这个类来封装的

35
00:02:10,790 --> 00:02:12,030
那就类似下面这个了

36
00:02:12,160 --> 00:02:15,600
树有很多结点,结点之间怎么样

37
00:02:15,730 --> 00:02:18,590
这个是跟之前一样的

38
00:02:20,100 --> 00:02:26,040
而这个就可以表达成树的一个约束

39
00:02:26,250 --> 00:02:30,600
一个不变式,任何一个树的实例

40
00:02:31,950 --> 00:02:34,390
它在稳定状态下的时候

41
00:02:35,110 --> 00:02:38,640
它应该满足,它的属性

42
00:02:38,770 --> 00:02:40,580
它的属性就是结点了

43
00:02:40,590 --> 00:02:43,620
很多结点,结点集合

44
00:02:44,330 --> 00:02:47,870
属性应该满足这个约束

45
00:02:47,880 --> 00:02:51,160
就是说,父结点为空的

46
00:02:52,090 --> 00:02:54,850
这样的一个结点,只有一个

47
00:02:55,140 --> 00:02:58,880
有且只有一个,等于1

48
00:03:01,010 --> 00:03:04,350
这是用OCL语法写的

49
00:03:04,780 --> 00:03:07,260
如果我们用编程语言

50
00:03:07,270 --> 00:03:08,740
比如用C#写

51
00:03:09,180 --> 00:03:12,850
我们可以改成LINQ的语法

52
00:03:13,170 --> 00:03:15,170
结点.Count

53
00:03:19,640 --> 00:03:21,840
这样来,这个时候

54
00:03:22,090 --> 00:03:23,320
这个树就代替了

55
00:03:24,510 --> 00:03:27,000
我们之前举例的时候的仓储了

56
00:03:30,470 --> 00:03:32,050
这个是更合理的

57
00:03:32,970 --> 00:03:35,850
能不引进一个

58
00:03:35,860 --> 00:03:38,380
或能不使用这种额外的

59
00:03:39,340 --> 00:03:40,620
非核心域的概念

60
00:03:40,630 --> 00:03:42,020
我们尽量不使用

61
00:03:42,910 --> 00:03:43,900
实在没办法了

62
00:03:44,760 --> 00:03:46,420
需要使用了再使用

63
00:03:49,990 --> 00:03:53,710
我们可以把它代到代码里面来看一下

这篇关于[图解]建模树型结构和不变式:类建模(高阶+ )片段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959406

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据