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

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

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径