Algorithm
- 题目:LeetCode-724 寻找数据的中心索引
- 分析
- 根据题目定定义,中心索引 i 左边和右边的元素之和相等,最直接的思路二层循环暴力来算,但是实际上
leftSum(i + 1) = leftSum(i) + nums[i]
,其中leftSum(i) = nums[0] + nums[1] + ... + nums[i - 1]
rightSum(i + 1) = rightSum(i + 1) + nums[i]
,其中rightSum(i + 1) = nums[i + 2] + nums[i + 3] + ... + nums[nums.length - 1]
- 需要注意情况,当 i 左边或右边没有元素时,和为 0
- 根据题目定定义,中心索引 i 左边和右边的元素之和相等,最直接的思路二层循环暴力来算,但是实际上
- 解法
- 如果
nums.length < 2
则中心索引为i
- 先算出 nums[1] 到 nums[nums.length -1] 之和记为初始 rightSum,初始 leftSum 为 0
- 从下标 1 开始遍历 nums,如果 leftSum 和 rightSum 相等或i == nums.length 时结束,如果 i < nums.lrgnth 返回 i,否则返回 -1
- 如果
- 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public int pivotIndex(int[] nums) {
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return 0;
}
int left = 0;
int right = 0;
for (int i = 1; i != nums.length; i++) {
right += nums[i];
}
int i = 1;
while (i < nums.length && left != right) {
left += nums[i - 1];
right -= nums[i];
i++;
}
return left == right ? i - 1 : -1;
}
Review
- 原文地址:MapReduce: Simplified Data Processing on Large Clusters
- Google 经典论文,提出了 MapReduce 编程模型,以及该模型在分布式系统下实现的一些要点和优化
- 背景:Google 处理大规模的数据需要解决并行化、数据分发、故障处理的问题
- 解法:提出 MapReduce 的编程模型,隐藏并行、数据分许、故障处理的细节
- Map:
(k1, v1) -> list(k2, v2)
根据输入的key/value
对生产新的key/value
对的集合,作为中间结果,计算逻辑需要用户实现 - Reduce:
(k2, list(v2)) -> list(v2)
从同一个key
有序结合中计算得出最终结果,计算逻辑需要用户实现
- Map:
- 影响
- 提出了处理海量数据的通用方案,推动了大数据计算领域发展
- 简化了并行、故障处理逻辑,提升了研发效果
- 提供了水平扩展能力,可以通过加机器来提升性能
- 工程设计
- Master Slave 架构:Master 负责监控Woker状态、调度任务
- 并行策略:
- 输入文件进行按切分,本质是上做分片,每个分片有对应的 Worker 进行处理
- Map 和 Reducer 阶段,Worker 之间没有数据重叠,因此不存在并发问题
- 故障处理策略:重新执行
- 执行 Map 任务的 Worker 故障:重新执行该 Worker 的 Map 任务以及相关的 Reduce 任务
- 执行 Reduce 任务的 Worker 故障:重新执行该 Worker 的 Reduce 任务
- 优化
- 本地化:MapReduce 的输入输出为 GFS 分布式文件系统,每个文件存多个副本(通常为3),给 Worker 分配任务时尽量分配给保存输入数据副本的 Worker,不满足条件时,尽量分给靠近持有副本结点的 Worker,降低网络 IO 开销
- Backup:当执行任务快结束时,还有某个结点特别慢(可能是机器硬件差或故障等原因)影响整个任务进度,会在其他结点执行一个 Backup 任务,这两个任务任意一个执行完就算执行完成
Tip
- 以 SDK 的形式提供能力是常见的做法,但是升级会非常头疼,可以考虑把 SDK api 声明暴露给用户,以 javaagent 的方式提供实现可以缓解这个问题,可以在这个方向有些探索
- 以 javaagent 的方式提供装饰逻辑,来代替 cglib 看起来具有分离、对用户无感知的优点
Share
读了《非暴力沟通》前两章,有几个印象比较深的点:
- 沟通的表达方式很重要,并且是可以后天训练的,有意识的行为比纯本能的行为通常更有效
- 学会区分观察和评论,不要习惯性采用防御性的姿态,学会区分是客观事实的评价,还是主观个人的评论