Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- General的建议
- 1. handout里废话很少,但是排版很乱,所以如果卡在某个地方,学会用搜索功能,找到提到这个地方的内容,一般比较绕的地方都能找到解释和example;比如说update_rectangles的算法和流程,这个要看清楚handout上的流程
- 2. 每完成一个task, 记得做Progress check,测试你确实完成了这个task
- 3. 如果卡住了,而且找不到handout上的内容,看一下demo视频,你也许会有新的灵感;还没有灵感,在piazza上搜索卡住的function名,说不定之前有同学已经碰到了类似的坑
- Task 2的坑
- 1. update_rectangles里那个for loop里,只要loop到subtrees[-2]为止, 最后一个subtree直接占满所有【剩下】的rect范围
- 2. recursion之后,别忘了update下一个subtree的开始x、y轴
- 3. treemap_visualiser.py里所有Task 2,需要uncomment掉一些东西才能正确跑起来
- Task 3
- 1. get_tree_at_position:
- a. base case: 当是leaf并在pos的范围内,直接return self
- b. for i in subtree,如果pos在i的rect范围里, pos的格式是(x, y), 则直接return i.get_tree_at_position(pos)
- c. 因为你要一层一层的找下去,比如说最外面那层文件夹是(0, 0, 100, 100),然后里面有个文件是(0, 0, 2, 2),然后你的pos是(1, 1), 那个你return的应该是(0, 0, 2, 2)这个rect对应的tree
- 2. treemap_visualiser.py里所有Task 3,需要uncomment掉一些东西才能正确跑起来
- Task 4
- 1. change_size
- a. base case: 当有subtree时,啥都不做
- b. self.data_size = self.data_size + math.ceil(self.data_size * factor)
- c. 注意,这里有坑(math.ceil),请你在python里测试当factor是0.01和-0.01出来的data_size的结果分别是什么,并对b作出更改
- 2. move
- a. base case: 当不满足(If this tree is a leaf, and <destination> is not a leaf)这个条件是,啥都不做
- b. 把self._parent_tree._subtrees里的self remove掉
- c. destination._subtrees append self
- d. 改变self._parent_tree到destination
- c. 注意,这个在没有写完task 5的时候是不好测试的
- 3. update_data_sizes
- a. 当empty或者是leaf的情况,loop self._parent_tree._subtrees 并把所有subtree的size加起来,让self._parent_tree.data_size等于这个size, 并把self.data_size return出来
- b. 否则,直接loop self.subtree, 然后recursively call update_data_sizes
- c. 最后return self.data_size
- 4. treemap_visualiser.py里所有Task 4,需要uncomment掉一些东西才能正确跑起来
- Task 5
- 0. 开始Task 5之前请确保之前的task都已经测试没有问题
- 1. 需要做改动的method如下:__init__, get_rectangles, get_tree_at_position, 基本上都会用到self._expanded, 需要做的改动很小,基本上都是加一个判断就够了
- 2. expand
- a. 当有subtree时,直接self._expand = True
- 3. expand_all
- a. 首先expand自己
- b. recursively expand所有自己的subtree
- 4. collapse
- a. expand相反的操作
- 5. collapse_all
- a. 这条题比较灵活,提供一个思路
- b. 首先找到最上层的parent(与linklistd的traversal类似)
- c. 写一个helper function, take a node, 然后如果这个node没有subtree, 直接call collapse(); 否则loop这个node的subtree, 并recursively call这个helper function, 把subtree丢进去
- d. call part c写的按个helper function, 然后把最上层的parent丢进去
- e. 最后让最上层的_expanded设为False
- 6. treemap_visualiser.py里所有Task 4,需要uncomment掉一些东西才能正确跑起来
- //////
- 1首先定义class mttree filesystem tree 根据doc写出来 会用到 os.path那些
- 第一,是不是文件夹
- 第二,传入string返回list,返回下面文件的名字string的list(并不是所有文件,只是下面的child)
- 第三,文件路径加,两个路径不能直接加,mac和windows的表达方式不一样,不要用加法只用join
- 第四,获取文件大小
- 第五,basename传入一个路径,获取文件的文件名例如传入../abc.txt 返回 abc.txt用它检测对应的文件名
- 如果文件夹是size是0return list如果它是一个leaf的话,他肯定是一个文件,data size就是文件的大小,如果与一个或者多个subtree,它的大小是一个或者多个文件的总大小
- Update size一个文件的同时也要update parent size
- 一个文件是它的base name不是完整的path
- Color = (random,randint(0,255),xxx,xxx)
- self.data_size = loop sum
- loop的同时把他们的parent tree set成之前的
- For I in self.subtrees
- i.parent = self
- 记得要un common掉v的东西不然测不出来
- 给你一个path
- 判断是不是文件
- Base 文件
- super().init(name,subtrees, data_size)
- Case 2文件夹
- List
- For I in 这个文件夹下的文件
- list.append(Filesystem(path)) //joined path 当前path + I
- Task2
- 算法
- 如果tree size 0
- 是base case(leaf)
- 当是文件的时候 self.rect = rect
- 当是文件夹的时候
- For I in subtrees
- x y width height = rect
- 这个tuple有坑,
- i.data_size / self.data_size = scale
- 用这个比例x width
- 如果width >= height
- H = height;
- 否则
- W = width
- Height = 比例 x height
- I update trangle()
- GetRectangle
- 找到所有leaf 然后
- Base case file/leave
- Return (self, rect,self_coor ,)
- 记得加逗号
- List = []
- For I in self.subtree
- list.extend(i.getRect())
- Return list
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement