SHOW:
|
|
- or go back to the newest paste.
1 | General的建议 | |
2 | 1. handout里废话很少,但是排版很乱,所以如果卡在某个地方,学会用搜索功能,找到提到这个地方的内容,一般比较绕的地方都能找到解释和example;比如说update_rectangles的算法和流程,这个要看清楚handout上的流程 | |
3 | 2. 每完成一个task, 记得做Progress check,测试你确实完成了这个task | |
4 | 3. 如果卡住了,而且找不到handout上的内容,看一下demo视频,你也许会有新的灵感;还没有灵感,在piazza上搜索卡住的function名,说不定之前有同学已经碰到了类似的坑 | |
5 | ||
6 | Task 2的坑 | |
7 | 1. update_rectangles里那个for loop里,只要loop到subtrees[-2]为止, 最后一个subtree直接占满所有【剩下】的rect范围 | |
8 | 2. recursion之后,别忘了update下一个subtree的开始x、y轴 | |
9 | 3. treemap_visualiser.py里所有Task 2,需要uncomment掉一些东西才能正确跑起来 | |
10 | ||
11 | Task 3 | |
12 | 1. get_tree_at_position: | |
13 | a. base case: 当是leaf并在pos的范围内,直接return self | |
14 | b. for i in subtree,如果pos在i的rect范围里, pos的格式是(x, y), 则直接return i.get_tree_at_position(pos) | |
15 | c. 因为你要一层一层的找下去,比如说最外面那层文件夹是(0, 0, 100, 100),然后里面有个文件是(0, 0, 2, 2),然后你的pos是(1, 1), 那个你return的应该是(0, 0, 2, 2)这个rect对应的tree | |
16 | 2. treemap_visualiser.py里所有Task 3,需要uncomment掉一些东西才能正确跑起来 | |
17 | ||
18 | Task 4 | |
19 | 1. change_size | |
20 | a. base case: 当有subtree时,啥都不做 | |
21 | b. self.data_size = self.data_size + math.ceil(self.data_size * factor) | |
22 | c. 注意,这里有坑(math.ceil),请你在python里测试当factor是0.01和-0.01出来的data_size的结果分别是什么,并对b作出更改 | |
23 | 2. move | |
24 | a. base case: 当不满足(If this tree is a leaf, and <destination> is not a leaf)这个条件是,啥都不做 | |
25 | b. 把self._parent_tree._subtrees里的self remove掉 | |
26 | c. destination._subtrees append self | |
27 | d. 改变self._parent_tree到destination | |
28 | c. 注意,这个在没有写完task 5的时候是不好测试的 | |
29 | 3. update_data_sizes | |
30 | a. 当empty或者是leaf的情况,loop self._parent_tree._subtrees 并把所有subtree的size加起来,让self._parent_tree.data_size等于这个size, 并把self.data_size return出来 | |
31 | b. 否则,直接loop self.subtree, 然后recursively call update_data_sizes | |
32 | c. 最后return self.data_size | |
33 | 4. treemap_visualiser.py里所有Task 4,需要uncomment掉一些东西才能正确跑起来 | |
34 | ||
35 | ||
36 | Task 5 | |
37 | 0. 开始Task 5之前请确保之前的task都已经测试没有问题 | |
38 | 1. 需要做改动的method如下:__init__, get_rectangles, get_tree_at_position, 基本上都会用到self._expanded, 需要做的改动很小,基本上都是加一个判断就够了 | |
39 | 2. expand | |
40 | a. 当有subtree时,直接self._expand = True | |
41 | 3. expand_all | |
42 | a. 首先expand自己 | |
43 | b. recursively expand所有自己的subtree | |
44 | 4. collapse | |
45 | a. expand相反的操作 | |
46 | 5. collapse_all | |
47 | a. 这条题比较灵活,提供一个思路 | |
48 | b. 首先找到最上层的parent(与linklistd的traversal类似) | |
49 | c. 写一个helper function, take a node, 然后如果这个node没有subtree, 直接call collapse(); 否则loop这个node的subtree, 并recursively call这个helper function, 把subtree丢进去 | |
50 | d. call part c写的按个helper function, 然后把最上层的parent丢进去 | |
51 | e. 最后让最上层的_expanded设为False | |
52 | - | 6. treemap_visualiser.py里所有Task 4,需要uncomment掉一些东西才能正确跑起来 |
52 | + | 6. treemap_visualiser.py里所有Task 4,需要uncomment掉一些东西才能正确跑起来 |
53 | ||
54 | ////// | |
55 | ||
56 | 1首先定义class mttree filesystem tree 根据doc写出来 会用到 os.path那些 | |
57 | 第一,是不是文件夹 | |
58 | 第二,传入string返回list,返回下面文件的名字string的list(并不是所有文件,只是下面的child) | |
59 | 第三,文件路径加,两个路径不能直接加,mac和windows的表达方式不一样,不要用加法只用join | |
60 | 第四,获取文件大小 | |
61 | 第五,basename传入一个路径,获取文件的文件名例如传入../abc.txt 返回 abc.txt用它检测对应的文件名 | |
62 | ||
63 | ||
64 | 如果文件夹是size是0return list如果它是一个leaf的话,他肯定是一个文件,data size就是文件的大小,如果与一个或者多个subtree,它的大小是一个或者多个文件的总大小 | |
65 | Update size一个文件的同时也要update parent size | |
66 | 一个文件是它的base name不是完整的path | |
67 | ||
68 | Color = (random,randint(0,255),xxx,xxx) | |
69 | ||
70 | self.data_size = loop sum | |
71 | loop的同时把他们的parent tree set成之前的 | |
72 | For I in self.subtrees | |
73 | i.parent = self | |
74 | ||
75 | 记得要un common掉v的东西不然测不出来 | |
76 | ||
77 | ||
78 | ||
79 | 给你一个path | |
80 | 判断是不是文件 | |
81 | Base 文件 | |
82 | super().init(name,subtrees, data_size) | |
83 | ||
84 | Case 2文件夹 | |
85 | List | |
86 | For I in 这个文件夹下的文件 | |
87 | list.append(Filesystem(path)) //joined path 当前path + I | |
88 | ||
89 | ||
90 | Task2 | |
91 | 算法 | |
92 | 如果tree size 0 | |
93 | 是base case(leaf) | |
94 | 当是文件的时候 self.rect = rect | |
95 | 当是文件夹的时候 | |
96 | ||
97 | For I in subtrees | |
98 | x y width height = rect | |
99 | ||
100 | 这个tuple有坑, | |
101 | i.data_size / self.data_size = scale | |
102 | 用这个比例x width | |
103 | 如果width >= height | |
104 | H = height; | |
105 | 否则 | |
106 | W = width | |
107 | Height = 比例 x height | |
108 | ||
109 | I update trangle() | |
110 | ||
111 | ||
112 | GetRectangle | |
113 | 找到所有leaf 然后 | |
114 | Base case file/leave | |
115 | Return (self, rect,self_coor ,) | |
116 | 记得加逗号 | |
117 | ||
118 | List = [] | |
119 | For I in self.subtree | |
120 | list.extend(i.getRect()) | |
121 | Return list |