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

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

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

龙蜥操作系统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元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可