前言
一种算法,计算洼地的容积简易版,洼地数组的容积计算
计算思路
实际上计算洼地的容积很难,立体空间,最常用的方式是极限思想,微积分,类似割圆术。把立体空间认为是很多微小的立方体。
那么进一步简化,计算2维空间的洼地容积
实际上还是可以使用极限的思想,看成很多微小的长方形,通过无限趋近的方式计算出来,不过这里的算法仅仅是一种更简单的算法,计算数组的洼地容积,即点的容积:如下图
var arr []int = []int{3, 5, 4, 6, 1, 4, 1,3}
计算洼地的数字的容积值的和
分析上图,计算数组的洼地容积,需要的洼地的核心数据已经画出横线了。根据规律,洼地最小值原则,木桶效应,算法经验总结:
1. 从左到右取最大值
2. 从右到左取最大值
3. 获取上面2步取到的最小值
4. 用最小值减去原始值
5. 求和上一步的结果
编写算法
package main
import "fmt"
func main() {
var arr []int = []int{3, 5, 4, 6, 1, 4, 1, 3}
len := len(arr)
var maxFromLeft int = 0
var arrLeftMax = make([]int, len)
var maxFromRight int = 0
var arrRightMax = make([]int, len)
//计算左边最大, 怀念Java流式计算,go有第3方实现
for i := 0; i < len; i++ {
if arr[i] > maxFromLeft {
maxFromLeft = arr[i]
}
arrLeftMax[i] = maxFromLeft
}
var count int = 0
for j := len - 1; j >= 0; j-- {
if arr[j] > maxFromRight {
maxFromRight = arr[j]
}
arrRightMax[j] = maxFromRight
//比对最小值,洼地是最小值,木桶原理,我们需要的就是最小值
//最小值对比原始值,顺便做容积计数求和
if arrRightMax[j] >= arrLeftMax[j] {
count += arrLeftMax[j] - arr[j]
} else {
count += arrRightMax[j] - arr[j]
}
}
fmt.Println("计算结果如下:", count)
}
当前的示例结果为6
总结
算法的本质是总结经验,实际上算法是很多规律计算出来的,当然也可以使用蛮力,毕竟计算机计算能力这么强。不过如果算法形成的数据结构那么就是规律的代表,比如数组、链表、树、表、图等