在公司加班,思考一个算法问题:
如何将M个表的数据分到K个桶中去(K不变,M可变)。
- 其中表已经排序,最大的表可能需要多个桶才能装下。
- 桶大小尽量一样(允许100以内的偏差,即最大桶的数量跟最小桶的数量之差值,不超过100)。
- 并且保证表的分割策略是恒定的(假设按单主键取模,那么同一个表的同一个主键,必须分配到相同的桶中去。)
问题定义完,我就知道,这个问题是很困难的。
因为每一批的M个表并不一致,上一次的最大表可能到下一次就沦为小表。
必须要记住每一批表的分配情况,还必须加上批数限制:分割策略在相邻两批内恒定。
以下为极端情况:
- 表A,第一批位于桶1, 桶2, 桶3。第二批中A更加庞大,分成三个桶后尺寸超大。(意味着桶大小必须动态平衡, 不能对M个表的总数据进行分批,而应该按照最大表的数据来进行分批)
- 表A,第一批位于桶1, 桶2, 桶3.第二批出现极端情况,所有A的数据都位于桶1,且数量达到最大表数据。(意味着表的分割策略要可扩展,且扩展后的分割策略与原始分割策略不交叠,而是有序下分。例如第一层策略是模3, 第二层是模7,诸如此类。)但也无法保证不出现桶等待情况:假设上一批A1mod3在桶1, 本批A1mod3数据量是上批的三倍(意味着要出现在桶1,桶2, 桶3),那么,本批的桶1, 桶 2, 3必须等待上批的桶1完全结束后才能进行处理,不然本批的桶2可能会包含与上批桶1相当主键的记录,在并发中失序,导致数据不一致。
总结:
- 数据分批策略:<最大表大小,总数据量> 可以避免超大表的极端情况。
- 大表拆分策略: <可扩展,多层次,不交叠> 并不能完全避免桶等待。
- 不考虑表优先级的情况,可以采用按桶散列均分的策略。
未来:
- 对快表分配固定的通道。
- 对其余表用通用算法。
教改班:
把一群尖子交给少数厉害的老师带,期望这群尖子更尖?
其实这种分组方法只是最大化利用了所谓教师资源。但教师资源就能让尖子更尖?
依靠教师的尖子不是真正的尖子。
更好的分类方法:
教学改革,每学期按周分成5个阶段,每个阶段对应固定的教学内容(教材/作业)。教师上课采取选课制度,每阶段学生可以自由换一次。教师集体备课,贡献题库、教材案列,每个教师在内容库中自由组合。监考,阅卷均采取回避原则。班级共同参加文体活动,而不一定在同一个教师处接受学习。习题课以班级为单位进行。
用金克木老爷子的话来讲,好的课堂,应该是老师与学生互动,尖子生主动回答难题,将一般题留给一般生回答。使得课堂效率最大化。
UGC产品:
中心式的UGC产品展示,只能导致僵化。
应该采取推送式季节制,用分配策略使得每个作品得到其应有的曝光度,每个读者尽可能多的欣赏作品。而不是让“大众的口味”(实质是中心式里起得早和运气好的那批)绑架了一整个季节。
(抽象,极大的提升了我们,但又让我们损失了很多很多。)
网友评论