假设我有几个盒子存放苹果,每个盒子(n)有不同数量的苹果(n)。现在我想知道是否有适合这些要求的数据结构和算法: 1.找到存储在这些框中的最大和最小苹果编号,以及相关的框编号n。 2.由于每个盒子中的苹果编号都在变化,我想更新apple(n)。显然,使用盒号来访问苹果号是最方便的。
希望你们能给我一些建议。谢谢!!!
答案 0 :(得分:0)
您可以在数组上强加树结构。树的叶子是阵列本身。下一级别的每个数组元素都有一个节点。下一级别每个节点有四个后代,依此类推......
15
13 14 9 10 11 12 1 2 3 4 5 6 7 8
此处1..8可能是原始数据点,较高的数字显示您可以添加的树节点。现在,如果您在每个内部节点上保持其后代中找到的最小值和最大值,您将在树的根处找到整个数组的最小值和最大值,并且您可以通过跟踪树来查找所涉及的索引它,或通过存储索引和值。更新叶子上的值时,如有必要,可以跟踪树,以重新计算存储在其父项中的最小值和最大值。所有这些操作都需要时间O(log n),因为这是树的高度。
例如,假设输入数据为101..108。这将生成以下最大值树,其中整个树的绝对最大值位于顶部:
108 104 108 102 104 106 108 101 102 103 104 105 106 107 108
如果现在将值104更改为109,您可以看到只需要将值从此处更改为树的顶部以恢复数据结构的不变量并在顶部获得新的最大值
109 109 108 102 109 106 108 101 102 103 109 105 106 107 108
答案 1 :(得分:0)
获取大小 n 的数组:
数组单元格代表框。最初所有单元格都填充零(因为最初没有苹果)
将数组初始化为:
max = 0,min = 0,maxbox = 0,minbox = 0
现在说,输入来添加j(用户输入)苹果到框i(0索引数组和用户输入),然后执行以下操作:负j表示删除苹果。
arr[i] = arr[i] + j;
if( arr[i] > max ){
max = arr[i];
maxbox = i;
}
if( arr[i] < min ){
min = arr[i];
minbox = i;
}
每当用户提供新输入时,您都可以执行上述操作并跟踪包含最小和最大苹果的框。
希望这有帮助!!!
答案 2 :(得分:0)
我认为最佳解决方案是堆排序算法。
如果将所有这些苹果盒中含有不同苹果的苹果视为不同的数字。
然后通过构建Heap然后应用堆排序将花费nlogn复杂性。你可以获得Max和Min box。
如果只需要找到Max或Min,你只需要构建堆。如果您想继续进行,则需要应用堆排序算法。