gpt4 book ai didi

algorithm - 线段树正确但查询输出不正确

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:39:21 25 4
gpt4 key购买 nike

我尝试在 Java 中实现用于查找范围最小查询的线段树算法。这是我完整的 java 代码。它从数组构建线段树。然后打印每个范围内的最小元素。问题是,树是正确的(据我所知),但输出始终是整个数组的最小元素。 :-|请指出我哪里出错了。

public class Solution {

static int arr[] = {-1, 2, 4, 0};
static int st[];

public static void main(String[] args) {

st = new int [ 2 * arr.length-1];

buildTree(0, 0, arr.length-1);

System.out.print("original array: ");
showArray(arr);

System.out.print("segment tree: ");
// shows segment tree
showArray(st);

System.out.println("\nqueries: \n");

// prints minimum in every range
for(int i=0; i<arr.length; i++) {
for(int j=i+1; j<arr.length; j++)
System.out.println(i+":"+j+" -> "+search(i, j));
}

}

// builds segment tree
static void buildTree(int pos, int left, int right) {

if(left == right) {
st[pos] = arr[left];
return;
}

int mid = (left + right) / 2;

buildTree(left(pos), left, mid);
buildTree(right(pos), mid+1, right);

int p1 = left(pos);
int p2 = right(pos);

st[pos] = (st[p1] > st[p2]) ? st[p2] : st[p1];
}

// left child
static int left(int pos) {
return pos * 2 + 1;
}

// right child
static int right(int pos) {
return pos * 2 + 2;
}

static int search(int left, int right) {

return rmq(0, 0, st.length, left, right);
}

// range minimum query function
static int rmq(int pos, int left, int right, int qleft, int qright) {

if((qleft > right) && (qright < left))
return Integer.MAX_VALUE;

if((qleft <= left) || (qright >= right))
return st[pos];

int mid = (left + right) / 2;

int l = rmq(left(pos), left, mid, qleft, qright);
int r = rmq(right(pos), mid + 1, right, qleft, qright);

return (l > r) ? r : l;
}

// show segment tree
static void showArray(int arr[]) {

for(Integer x : arr)
System.out.print(x+" ");
System.out.println();
}
}

最佳答案

您必须在代码中进行以下更改。

首先,segmentree 数据结构中用于存储数据的数组大小应该是给定数组大小的 4 倍。 Here是为什么呢?

st = new int [ 4 * arr.length - 1];

接下来在search 函数中,rmq 的第三个参数必须是arr.length - 1

static int search(int left, int right) {
return rmq(0, 0, arr.length - 1, left, right);
}

最后,您必须更正 rmq 函数中的子调用中的基本情况和参数,如下所示:

static int rmq(int pos, int left, int right, int qleft, int qright) {

if((qleft > right) || (qright < left))
return Integer.MAX_VALUE;

if((qleft <= left) && (qright >= right))
return st[pos];

int mid = (left + right) / 2;

int l = rmq(left(pos), left, mid, qleft, Math.min(qright, mid) );
int r = rmq(right(pos), mid + 1, right, Math.max(mid + 1, qleft), qright);

return (l > r) ? r : l;
}

希望这对您有所帮助。

关于algorithm - 线段树正确但查询输出不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com