我们收集的数据中,我们沿着卷尺测量了特定物种重叠的长度。在某些情况下,多个物种可能在同一地点重叠。当多株植物重叠同一个斑点时,我需要弄清楚有多少胶带被植物重叠而没有计算两次相同长度的胶带,我需要按照植被类型(例如灌木,树等)进行分组。所以,我回答了这个问题,"灌木覆盖了多少胶带?"例如。
,例如,虚线是卷尺,星号是与胶带重叠的不同灌木。这就是我的数据现在基本上代表的。如果算上所有灌木的长度,我会得到一个很大的数字,比胶带的实际长度长......
*** ** *********
**** ** *******
----------------------------
...但这是我需要弄清楚的,任何灌木覆盖的实际长度:
***** ** **************
----------------------------
我希望这是有道理的,但这里有一些例子可以在需要时进一步解释:
示例:想象一下,我遇到了与4'标记为10'马克和20'标记为25'标记。我还遇到了云杉树与7'至14'分数。我需要知道树种重叠的总长度(这些都是树木),所以我需要总结这些范围的长度为Spruce和Doug Fir。但是,如果我只是正常地计算所有范围,我将最终计算7'至10'区域(总和= 3')两次而不是一次,Spruce和Doug Firs都在覆盖磁带。所以,我需要减去3'从最终值开始,这样卷尺的这一部分不会被计算多次。所以,我的范围是6',5'和7',总共18'。在减去重叠的3'之后,总共得到15'树木与胶带重叠的脚。
下面的示例表。我已经有SPECIES,START,END,TYPE和SUM数据。我需要擅长帮助我计算的是表格下面显示的值,它们是考虑多物种重叠后的总和。例如,如果灌木X与10'重叠。至20'和灌木Y重叠于13'至25',总重叠将来自10'至25'所以十五英尺的重叠。重叠不是22英尺,如果您分别计算每个范围,将会是这样。)
SPECIES START(ft) END(ft) TYPE SUM (ft)
Dogwood 40.3 40.9 Shrub 0.6
Cedar 52.8 79.5 Tree 26.7
Dogwood 50.2 55.6 Shrub 5.4
Rose 53.8 54.4 Shrub 0.6
Alder 88.2 95.5 Tree 7.3
Clover 75.8 76.2 Forb 0.4
Bunch 82.8 90.3 Grass 7.5
Poa 86.1 95.3 Grass 9.2
Sedge 99.4 100.9 Grass 1.5
Bttrcp 74.5 101.3 Forb 26.8
Elder 105.8 120.3 Shrub 14.5
Bttrcp 110.3 120.2 Forb 9.9
Cedar 90.4 99.9 Tree 9.5
SHRUB SUM TREE SUM FORB SUM GRASS SUM
20.5 38.4 35.4 14
任何有关解决这个问题的指导都将非常感谢!
答案 0 :(得分:0)
这是一些可能有用的伪代码。此外,这仅针对每种类型进行估算。要获得整个区域,请为每个TYPE重复:
get_max_area(data):
sort(data, START)
for i <- 1 to n:
for j <- i to n:
if data[j][START] < data[i][START]: // Two segments overlap
if data[j][END] < data[i][END]: // j is fully contained within i
ignore(data[j])
else: // They just overlap
merge(data[i], data[i + 1])
// ELSE: independent segments
return sum(data[SUM])
忽略意味着该段不再被测试。合并意味着使分段a(i,j)和b(x,y)成为新的分段c(i,y)。这只是一种快速方法,需要O(n ^ 2)。必须有一个更好的方法。