This is an automated email from the ASF dual-hosted git repository.

leirui pushed a commit to branch research/area-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 65d259e51114a60ec20cda67423df30c41b18de5
Author: Lei Rui <[email protected]>
AuthorDate: Wed Jan 22 14:48:53 2025 +0800

    array
---
 .../java/org/apache/iotdb/db/query/eBUG/eBUG.java  | 57 ++++++++-------
 ...d.java => eBUG_sortedEliminatedDeprecated.java} | 60 +++++++--------
 ...va => eBUG_sortedEliminatedDeprecated_tmp.java} | 85 +++++++++++-----------
 .../org/apache/iotdb/db/query/eBUG/eBUG_tmp.java   | 83 +++++++++++----------
 4 files changed, 143 insertions(+), 142 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
index 1596f32a726..d4a8ebfc36f 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG.java
@@ -19,7 +19,9 @@
 
 package org.apache.iotdb.db.query.eBUG;
 
-import java.io.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
 import java.util.*;
 
 import static org.apache.iotdb.db.query.eBUG.Tool.total_areal_displacement;
@@ -27,9 +29,12 @@ import static org.apache.iotdb.db.query.eBUG.Tool.triArea;
 
 
 public class eBUG {
-    public static List<Point> findEliminated(Polyline lineToSimplify, 
TimestampPriorityQueue recentEliminatedOrdered,
+    public static List<Point> findEliminated(Polyline lineToSimplify, int[] 
recentEliminated,
                                              int pa_idx, int pi_idx, int 
pb_idx) {
         // TODO 复杂度分析
+        //  从最近淘汰的e个点里寻找位于pa~pb之间的:e
+        //  把上一步找到的点和pa pi pb一起按照时间戳递增排序:记c=b-a。如果e<c,那么eloge,否则c
+        //  后面鞋带公式计算面积:min(e+3,c)
         // 性质:最近淘汰的那一个点一定是位于pa~pb之间,因为正是这个点的淘汰才使得pi的significance要更新!
         // pi: the point whose significance needs updating
         // pa: left adjacent non-eliminated point of pi
@@ -51,7 +56,7 @@ public class eBUG {
 //            return res; // pa pi pb已经按照时间戳递增
 //        }
 
-        if (recentEliminatedOrdered.size() >= (pb_idx - pa_idx - 2)) { // e >= 
the total number of eliminated points in this region
+        if (recentEliminated.length >= (pb_idx - pa_idx - 2)) { // e >= the 
total number of eliminated points in this region
 //            System.out.println("[c=(b-a-2)]<=e, use T directly"); // worst 
case下, k=c
             res = lineToSimplify.getVertices().subList(pa_idx, pb_idx + 1); // 
左闭右开
             return res; // 已经按照时间戳递增
@@ -60,26 +65,23 @@ public class eBUG {
         // 从最近淘汰的e个点里寻找位于pa~pb之间的点,找到的有可能小于e个点
 //        System.out.println("k>=[c=(b-a-2)]>e, search among e");
         res.add(pa);
+        res.add(pi);
+        res.add(pb);
 
         // 包括了c>e=0的情况
-        boolean addPi = false;
-        for (Point p : recentEliminatedOrdered.getQueue()) { // 
已经按时间戳递增排序,为了后面计算total areal displacement需要
-            if (p.x <= pa.x) {
-                continue;
-            }
-            if (p.x >= pb.x) {
+        for (int idx : recentEliminated) { // e points
+            if (idx == 0) { // init, not filled by real eliminated points yet
                 break;
             }
-            if (p.x > pi.x && !addPi) {
-                res.add(pi);
-                addPi = true;
+            Point p = lineToSimplify.get(idx);
+            if (p.x > pa.x && p.x < pb.x) {
+                res.add(p);
             }
-            res.add(p);
-        }
-        if (!addPi) { // may happen when no eliminated points found above
-            res.add(pi);
         }
-        res.add(pb);
+
+        // 按照时间戳递增排序,这是为了后面计算total areal displacement需要
+        res.sort(Comparator.comparingDouble(p -> p.x)); // 按时间戳排序 TODO 
这样的话时间复杂度要变成e*log(e)了吧?
+
         return res;
     }
 
@@ -92,9 +94,8 @@ public class eBUG {
 //        results.addAll(lineToSimplify.getVertices()); // TODO debug
 
         // TODO 需要一个东西来记录最近淘汰的点依次是谁
-//        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
-//        int recentEliminatedIdx = 0;  // index in the array, circulate
-        TimestampPriorityQueue recentEliminatedOrdered = new 
TimestampPriorityQueue(e);
+        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
+        int recentEliminatedIdx = 0;  // index in the array, circulate
 
         int total = lineToSimplify.size();
         if (total < 3) {
@@ -142,12 +143,11 @@ public class eBUG {
                 System.out.println("(1) eliminate " + 
lineToSimplify.get(tri.indices[1]));
             }
             if (e > 0) { // otherwise e=0
-//                recentEliminated[recentEliminatedIdx] = tri.indices[1];
-//                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 
0~e-1 circulate
-                
recentEliminatedOrdered.insert(lineToSimplify.get(tri.indices[1]));
+                recentEliminated[recentEliminatedIdx] = tri.indices[1];
+                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 
circulate
             }
             if (debug) {
-                System.out.println("the e most recently eliminated points:" + 
recentEliminatedOrdered);
+                System.out.println("the e most recently eliminated points:" + 
Arrays.toString(recentEliminated));
             }
 
             // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标)
@@ -176,7 +176,7 @@ public class eBUG {
                 tri.prev.indices[2] = tri.indices[2];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
                         tri.prev.indices[0],
                         tri.prev.indices[1],
                         tri.prev.indices[2]); // TODO complexity ?
@@ -225,7 +225,7 @@ public class eBUG {
                 tri.next.indices[0] = tri.indices[0];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
                         tri.next.indices[0],
                         tri.next.indices[1],
                         tri.next.indices[2]); // TODO complexity
@@ -298,8 +298,9 @@ public class eBUG {
 //        List<Point> results = new ArrayList<>();
         // 计算运行时间
 //        int eParam = 10;
-        try (PrintWriter writer = new PrintWriter(new File("exp2.csv"))) {
-            int[] eParamList = {0, 1, 100, 500, 1000, 5000, 10000, 50000, 
10_0000, 50_0000, 100_0000, 200_0000};
+        try (PrintWriter writer = new PrintWriter(new File("exp.csv"))) {
+            int[] eParamList = {0, 1, 100, 500, 1000, 5000, 10000, 50000, 
10_0000, 30_0000, 50_0000, 60_0000,
+                    70_0000, 80_0000, 90_0000, 100_0000, 150_0000, 200_0000, 
250_0000, 300_0000};
 //            for (int eParam = 0; eParam < 2 * n; eParam += 1000) {
             for (int eParam : eParamList) {
                 long startTime = System.currentTimeMillis();
diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated.java
similarity index 91%
rename from server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old.java
rename to 
server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated.java
index 180f277c44e..61c508added 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated.java
@@ -19,22 +19,17 @@
 
 package org.apache.iotdb.db.query.eBUG;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
+import java.io.*;
 import java.util.*;
 
 import static org.apache.iotdb.db.query.eBUG.Tool.total_areal_displacement;
 import static org.apache.iotdb.db.query.eBUG.Tool.triArea;
 
 
-public class eBUG_old {
-    public static List<Point> findEliminated(Polyline lineToSimplify, int[] 
recentEliminated,
+public class eBUG_sortedEliminatedDeprecated {
+    public static List<Point> findEliminated(Polyline lineToSimplify, 
TimestampPriorityQueue recentEliminatedOrdered,
                                              int pa_idx, int pi_idx, int 
pb_idx) {
         // TODO 复杂度分析
-        //  从最近淘汰的e个点里寻找位于pa~pb之间的:e
-        //  把上一步找到的点和pa pi pb一起按照时间戳递增排序:记c=b-a。如果e<c,那么eloge,否则c
-        //  后面鞋带公式计算面积:min(e+3,c)
         // 性质:最近淘汰的那一个点一定是位于pa~pb之间,因为正是这个点的淘汰才使得pi的significance要更新!
         // pi: the point whose significance needs updating
         // pa: left adjacent non-eliminated point of pi
@@ -56,7 +51,7 @@ public class eBUG_old {
 //            return res; // pa pi pb已经按照时间戳递增
 //        }
 
-        if (recentEliminated.length >= (pb_idx - pa_idx - 2)) { // e >= the 
total number of eliminated points in this region
+        if (recentEliminatedOrdered.size() >= (pb_idx - pa_idx - 2)) { // e >= 
the total number of eliminated points in this region
 //            System.out.println("[c=(b-a-2)]<=e, use T directly"); // worst 
case下, k=c
             res = lineToSimplify.getVertices().subList(pa_idx, pb_idx + 1); // 
左闭右开
             return res; // 已经按照时间戳递增
@@ -65,23 +60,26 @@ public class eBUG_old {
         // 从最近淘汰的e个点里寻找位于pa~pb之间的点,找到的有可能小于e个点
 //        System.out.println("k>=[c=(b-a-2)]>e, search among e");
         res.add(pa);
-        res.add(pi);
-        res.add(pb);
 
         // 包括了c>e=0的情况
-        for (int idx : recentEliminated) { // e points
-            if (idx == 0) { // init, not filled by real eliminated points yet
+        boolean addPi = false;
+        for (Point p : recentEliminatedOrdered.getQueue()) { // 
已经按时间戳递增排序,为了后面计算total areal displacement需要
+            if (p.x <= pa.x) {
+                continue;
+            }
+            if (p.x >= pb.x) {
                 break;
             }
-            Point p = lineToSimplify.get(idx);
-            if (p.x > pa.x && p.x < pb.x) {
-                res.add(p);
+            if (p.x > pi.x && !addPi) {
+                res.add(pi);
+                addPi = true;
             }
+            res.add(p);
         }
-
-        // 按照时间戳递增排序,这是为了后面计算total areal displacement需要
-        res.sort(Comparator.comparingDouble(p -> p.x)); // 按时间戳排序 TODO 
这样的话时间复杂度要变成e*log(e)了吧?
-
+        if (!addPi) { // may happen when no eliminated points found above
+            res.add(pi);
+        }
+        res.add(pb);
         return res;
     }
 
@@ -94,8 +92,9 @@ public class eBUG_old {
 //        results.addAll(lineToSimplify.getVertices()); // TODO debug
 
         // TODO 需要一个东西来记录最近淘汰的点依次是谁
-        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
-        int recentEliminatedIdx = 0;  // index in the array, circulate
+//        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
+//        int recentEliminatedIdx = 0;  // index in the array, circulate
+        TimestampPriorityQueue recentEliminatedOrdered = new 
TimestampPriorityQueue(e);
 
         int total = lineToSimplify.size();
         if (total < 3) {
@@ -143,11 +142,12 @@ public class eBUG_old {
                 System.out.println("(1) eliminate " + 
lineToSimplify.get(tri.indices[1]));
             }
             if (e > 0) { // otherwise e=0
-                recentEliminated[recentEliminatedIdx] = tri.indices[1];
-                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 
circulate
+//                recentEliminated[recentEliminatedIdx] = tri.indices[1];
+//                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 
0~e-1 circulate
+                
recentEliminatedOrdered.insert(lineToSimplify.get(tri.indices[1]));
             }
             if (debug) {
-                System.out.println("the e most recently eliminated points:" + 
Arrays.toString(recentEliminated));
+                System.out.println("the e most recently eliminated points:" + 
recentEliminatedOrdered);
             }
 
             // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标)
@@ -176,7 +176,7 @@ public class eBUG_old {
                 tri.prev.indices[2] = tri.indices[2];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
                         tri.prev.indices[0],
                         tri.prev.indices[1],
                         tri.prev.indices[2]); // TODO complexity ?
@@ -225,7 +225,7 @@ public class eBUG_old {
                 tri.next.indices[0] = tri.indices[0];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
                         tri.next.indices[0],
                         tri.next.indices[1],
                         tri.next.indices[2]); // TODO complexity
@@ -298,9 +298,9 @@ public class eBUG_old {
 //        List<Point> results = new ArrayList<>();
         // 计算运行时间
 //        int eParam = 10;
-        try (PrintWriter writer = new PrintWriter(new File("exp.csv"))) {
-            int[] eParamList = {0, 1, 100, 500, 1000, 5000, 10000, 50000, 
10_0000, 30_0000, 50_0000, 60_0000,
-                    70_0000, 80_0000, 90_0000, 100_0000, 150_0000, 200_0000, 
250_0000, 300_0000};
+        try (PrintWriter writer = new PrintWriter(new File("exp2.csv"))) {
+            int[] eParamList = {0, 1, 100, 500, 1000, 5000, 10000, 50000, 
10_0000, 50_0000, 60_0000, 70_0000,
+                    80_0000, 90_0000, 100_0000, 150_0000, 200_0000};
 //            for (int eParam = 0; eParam < 2 * n; eParam += 1000) {
             for (int eParam : eParamList) {
                 long startTime = System.currentTimeMillis();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old_tmp.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated_tmp.java
similarity index 88%
rename from 
server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old_tmp.java
rename to 
server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated_tmp.java
index 5cfafb59110..4d933cfcd2e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_old_tmp.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_sortedEliminatedDeprecated_tmp.java
@@ -27,13 +27,10 @@ import static 
org.apache.iotdb.db.query.eBUG.Tool.total_areal_displacement;
 import static org.apache.iotdb.db.query.eBUG.Tool.triArea;
 
 
-public class eBUG_old_tmp {
-    public static List<Point> findEliminated(Polyline lineToSimplify, int[] 
recentEliminated,
+public class eBUG_sortedEliminatedDeprecated_tmp {
+    public static List<Point> findEliminated(Polyline lineToSimplify, 
TimestampPriorityQueue recentEliminatedOrdered,
                                              int pa_idx, int pi_idx, int 
pb_idx) {
         // TODO 复杂度分析
-        //  从最近淘汰的e个点里寻找位于pa~pb之间的:e
-        //  把上一步找到的点和pa pi pb一起按照时间戳递增排序:记c=b-a。如果e<c,那么eloge,否则c
-        //  后面鞋带公式计算面积:min(e+3,c)
         // 性质:最近淘汰的那一个点一定是位于pa~pb之间,因为正是这个点的淘汰才使得pi的significance要更新!
         // pi: the point whose significance needs updating
         // pa: left adjacent non-eliminated point of pi
@@ -55,7 +52,7 @@ public class eBUG_old_tmp {
 //            return res; // pa pi pb已经按照时间戳递增
 //        }
 
-        if (recentEliminated.length >= (pb_idx - pa_idx - 2)) { // e >= the 
total number of eliminated points in this region
+        if (recentEliminatedOrdered.size() >= (pb_idx - pa_idx - 2)) { // e >= 
the total number of eliminated points in this region
 //            System.out.println("[c=(b-a-2)]<=e, use T directly"); // worst 
case下, k=c
             res = lineToSimplify.getVertices().subList(pa_idx, pb_idx + 1); // 
左闭右开
             return res; // 已经按照时间戳递增
@@ -64,23 +61,26 @@ public class eBUG_old_tmp {
         // 从最近淘汰的e个点里寻找位于pa~pb之间的点,找到的有可能小于e个点
 //        System.out.println("k>=[c=(b-a-2)]>e, search among e");
         res.add(pa);
-        res.add(pi);
-        res.add(pb);
 
         // 包括了c>e=0的情况
-        for (int idx : recentEliminated) { // e points
-            if (idx == 0) { // init, not filled by real eliminated points yet
+        boolean addPi = false;
+        for (Point p : recentEliminatedOrdered.getQueue()) { // 
已经按时间戳递增排序,为了后面计算total areal displacement需要
+            if (p.x <= pa.x) {
+                continue;
+            }
+            if (p.x >= pb.x) {
                 break;
             }
-            Point p = lineToSimplify.get(idx);
-            if (p.x > pa.x && p.x < pb.x) {
-                res.add(p);
+            if (p.x > pi.x && !addPi) {
+                res.add(pi);
+                addPi = true;
             }
+            res.add(p);
         }
-
-        // 按照时间戳递增排序,这是为了后面计算total areal displacement需要
-        res.sort(Comparator.comparingDouble(p -> p.x)); // 按时间戳排序 TODO 
这样的话时间复杂度要变成e*log(e)了吧?
-
+        if (!addPi) { // may happen when no eliminated points found above
+            res.add(pi);
+        }
+        res.add(pb);
         return res;
     }
 
@@ -93,8 +93,9 @@ public class eBUG_old_tmp {
 //        results.addAll(lineToSimplify.getVertices()); // TODO debug
 
         // TODO 需要一个东西来记录最近淘汰的点依次是谁
-        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
-        int recentEliminatedIdx = 0;  // index in the array, circulate
+//        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
+//        int recentEliminatedIdx = 0;  // index in the array, circulate
+        TimestampPriorityQueue recentEliminatedOrdered = new 
TimestampPriorityQueue(e);
 
         int total = lineToSimplify.size();
         if (total < 3) {
@@ -142,11 +143,12 @@ public class eBUG_old_tmp {
                 System.out.println("(1) eliminate " + 
lineToSimplify.get(tri.indices[1]));
             }
             if (e > 0) { // otherwise e=0
-                recentEliminated[recentEliminatedIdx] = tri.indices[1];
-                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 
circulate
+//                recentEliminated[recentEliminatedIdx] = tri.indices[1];
+//                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 
0~e-1 circulate
+                
recentEliminatedOrdered.insert(lineToSimplify.get(tri.indices[1]));
             }
             if (debug) {
-                System.out.println("the e most recently eliminated points:" + 
Arrays.toString(recentEliminated));
+                System.out.println("the e most recently eliminated points:" + 
recentEliminatedOrdered);
             }
 
             // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标)
@@ -175,7 +177,7 @@ public class eBUG_old_tmp {
                 tri.prev.indices[2] = tri.indices[2];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
                         tri.prev.indices[0],
                         tri.prev.indices[1],
                         tri.prev.indices[2]); // TODO complexity ?
@@ -224,7 +226,7 @@ public class eBUG_old_tmp {
                 tri.next.indices[0] = tri.indices[0];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
                         tri.next.indices[0],
                         tri.next.indices[1],
                         tri.next.indices[2]); // TODO complexity
@@ -264,6 +266,7 @@ public class eBUG_old_tmp {
         Polyline polyline = new Polyline();
         List<Polyline> polylineList = new ArrayList<>();
         Random rand = new Random(1);
+//        int n = 1000_0000;
         int n = 10000;
 
         int p = 10;
@@ -279,31 +282,29 @@ public class eBUG_old_tmp {
             polylineList.add(polylineBatch);
         }
 
-//        try (FileWriter writer = new FileWriter("raw.csv")) {
-//            // 写入CSV头部
-//            writer.append("x,y,z\n");
-//
-//            // 写入每个点的数据
-//            for (int i = 0; i < polyline.size(); i++) {
-//                Point point = polyline.get(i);
-//                writer.append(point.x + "," + point.y + "," + point.z + 
"\n");
-//            }
-//            System.out.println("Data has been written");
-//        } catch (IOException e) {
-//            System.out.println("Error writing to CSV file: " + 
e.getMessage());
-//        }
+        try (FileWriter writer = new FileWriter("raw.csv")) {
+            // 写入CSV头部
+            writer.append("x,y,z\n");
+
+            // 写入每个点的数据
+            for (int i = 0; i < polyline.size(); i++) {
+                Point point = polyline.get(i);
+                writer.append(point.x + "," + point.y + "," + point.z + "\n");
+            }
+            System.out.println("Data has been written");
+        } catch (IOException e) {
+            System.out.println("Error writing to CSV file: " + e.getMessage());
+        }
 
         System.out.println("---------------------------------");
 //        List<Point> results = new ArrayList<>();
         // 计算运行时间
-//        int eParam = 10;
-//            for (int eParam = 0; eParam < 2 * n; eParam += 1000) {
-        int eParam = 22;
+        int eParam = 0;
         long startTime = System.currentTimeMillis();
         List<Point> results = buildEffectiveArea(polyline, eParam, false);
         // 输出结果
         long endTime = System.currentTimeMillis();
-        System.out.println("n=" + n + ", e=" + eParam + ", Time taken to 
reduce points: " + (endTime - startTime) + "ms");
+        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
         System.out.println(results.size());
 
         if (results.size() <= 100) {
@@ -314,7 +315,7 @@ public class eBUG_old_tmp {
             }
         }
 
-        try (FileWriter writer = new FileWriter("fast2.csv")) {
+        try (FileWriter writer = new FileWriter("fast.csv")) {
             // 写入CSV头部
             writer.append("x,y,z\n");
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_tmp.java 
b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_tmp.java
index a04c4c17920..93267df65a7 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_tmp.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/eBUG/eBUG_tmp.java
@@ -28,9 +28,12 @@ import static org.apache.iotdb.db.query.eBUG.Tool.triArea;
 
 
 public class eBUG_tmp {
-    public static List<Point> findEliminated(Polyline lineToSimplify, 
TimestampPriorityQueue recentEliminatedOrdered,
+    public static List<Point> findEliminated(Polyline lineToSimplify, int[] 
recentEliminated,
                                              int pa_idx, int pi_idx, int 
pb_idx) {
         // TODO 复杂度分析
+        //  从最近淘汰的e个点里寻找位于pa~pb之间的:e
+        //  把上一步找到的点和pa pi pb一起按照时间戳递增排序:记c=b-a。如果e<c,那么eloge,否则c
+        //  后面鞋带公式计算面积:min(e+3,c)
         // 性质:最近淘汰的那一个点一定是位于pa~pb之间,因为正是这个点的淘汰才使得pi的significance要更新!
         // pi: the point whose significance needs updating
         // pa: left adjacent non-eliminated point of pi
@@ -52,7 +55,7 @@ public class eBUG_tmp {
 //            return res; // pa pi pb已经按照时间戳递增
 //        }
 
-        if (recentEliminatedOrdered.size() >= (pb_idx - pa_idx - 2)) { // e >= 
the total number of eliminated points in this region
+        if (recentEliminated.length >= (pb_idx - pa_idx - 2)) { // e >= the 
total number of eliminated points in this region
 //            System.out.println("[c=(b-a-2)]<=e, use T directly"); // worst 
case下, k=c
             res = lineToSimplify.getVertices().subList(pa_idx, pb_idx + 1); // 
左闭右开
             return res; // 已经按照时间戳递增
@@ -61,26 +64,23 @@ public class eBUG_tmp {
         // 从最近淘汰的e个点里寻找位于pa~pb之间的点,找到的有可能小于e个点
 //        System.out.println("k>=[c=(b-a-2)]>e, search among e");
         res.add(pa);
+        res.add(pi);
+        res.add(pb);
 
         // 包括了c>e=0的情况
-        boolean addPi = false;
-        for (Point p : recentEliminatedOrdered.getQueue()) { // 
已经按时间戳递增排序,为了后面计算total areal displacement需要
-            if (p.x <= pa.x) {
-                continue;
-            }
-            if (p.x >= pb.x) {
+        for (int idx : recentEliminated) { // e points
+            if (idx == 0) { // init, not filled by real eliminated points yet
                 break;
             }
-            if (p.x > pi.x && !addPi) {
-                res.add(pi);
-                addPi = true;
+            Point p = lineToSimplify.get(idx);
+            if (p.x > pa.x && p.x < pb.x) {
+                res.add(p);
             }
-            res.add(p);
-        }
-        if (!addPi) { // may happen when no eliminated points found above
-            res.add(pi);
         }
-        res.add(pb);
+
+        // 按照时间戳递增排序,这是为了后面计算total areal displacement需要
+        res.sort(Comparator.comparingDouble(p -> p.x)); // 按时间戳排序 TODO 
这样的话时间复杂度要变成e*log(e)了吧?
+
         return res;
     }
 
@@ -93,9 +93,8 @@ public class eBUG_tmp {
 //        results.addAll(lineToSimplify.getVertices()); // TODO debug
 
         // TODO 需要一个东西来记录最近淘汰的点依次是谁
-//        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
-//        int recentEliminatedIdx = 0;  // index in the array, circulate
-        TimestampPriorityQueue recentEliminatedOrdered = new 
TimestampPriorityQueue(e);
+        int[] recentEliminated = new int[e]; // init 0 points to the first 
point, skipped in findEliminated
+        int recentEliminatedIdx = 0;  // index in the array, circulate
 
         int total = lineToSimplify.size();
         if (total < 3) {
@@ -143,12 +142,11 @@ public class eBUG_tmp {
                 System.out.println("(1) eliminate " + 
lineToSimplify.get(tri.indices[1]));
             }
             if (e > 0) { // otherwise e=0
-//                recentEliminated[recentEliminatedIdx] = tri.indices[1];
-//                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 
0~e-1 circulate
-                
recentEliminatedOrdered.insert(lineToSimplify.get(tri.indices[1]));
+                recentEliminated[recentEliminatedIdx] = tri.indices[1];
+                recentEliminatedIdx = (recentEliminatedIdx + 1) % e; // 0~e-1 
circulate
             }
             if (debug) {
-                System.out.println("the e most recently eliminated points:" + 
recentEliminatedOrdered);
+                System.out.println("the e most recently eliminated points:" + 
Arrays.toString(recentEliminated));
             }
 
             // 更新当前点的重要性(z 轴存储effective area,这是一个单调增的指标)
@@ -177,7 +175,7 @@ public class eBUG_tmp {
                 tri.prev.indices[2] = tri.indices[2];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
                         tri.prev.indices[0],
                         tri.prev.indices[1],
                         tri.prev.indices[2]); // TODO complexity ?
@@ -226,7 +224,7 @@ public class eBUG_tmp {
                 tri.next.indices[0] = tri.indices[0];
 
                 // e parameter
-                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminatedOrdered,
+                List<Point> pointsForSig = findEliminated(lineToSimplify, 
recentEliminated,
                         tri.next.indices[0],
                         tri.next.indices[1],
                         tri.next.indices[2]); // TODO complexity
@@ -266,7 +264,6 @@ public class eBUG_tmp {
         Polyline polyline = new Polyline();
         List<Polyline> polylineList = new ArrayList<>();
         Random rand = new Random(1);
-//        int n = 1000_0000;
         int n = 10000;
 
         int p = 10;
@@ -282,29 +279,31 @@ public class eBUG_tmp {
             polylineList.add(polylineBatch);
         }
 
-        try (FileWriter writer = new FileWriter("raw.csv")) {
-            // 写入CSV头部
-            writer.append("x,y,z\n");
-
-            // 写入每个点的数据
-            for (int i = 0; i < polyline.size(); i++) {
-                Point point = polyline.get(i);
-                writer.append(point.x + "," + point.y + "," + point.z + "\n");
-            }
-            System.out.println("Data has been written");
-        } catch (IOException e) {
-            System.out.println("Error writing to CSV file: " + e.getMessage());
-        }
+//        try (FileWriter writer = new FileWriter("raw.csv")) {
+//            // 写入CSV头部
+//            writer.append("x,y,z\n");
+//
+//            // 写入每个点的数据
+//            for (int i = 0; i < polyline.size(); i++) {
+//                Point point = polyline.get(i);
+//                writer.append(point.x + "," + point.y + "," + point.z + 
"\n");
+//            }
+//            System.out.println("Data has been written");
+//        } catch (IOException e) {
+//            System.out.println("Error writing to CSV file: " + 
e.getMessage());
+//        }
 
         System.out.println("---------------------------------");
 //        List<Point> results = new ArrayList<>();
         // 计算运行时间
-        int eParam = 0;
+//        int eParam = 10;
+//            for (int eParam = 0; eParam < 2 * n; eParam += 1000) {
+        int eParam = 22;
         long startTime = System.currentTimeMillis();
         List<Point> results = buildEffectiveArea(polyline, eParam, false);
         // 输出结果
         long endTime = System.currentTimeMillis();
-        System.out.println("Time taken to reduce points: " + (endTime - 
startTime) + "ms");
+        System.out.println("n=" + n + ", e=" + eParam + ", Time taken to 
reduce points: " + (endTime - startTime) + "ms");
         System.out.println(results.size());
 
         if (results.size() <= 100) {
@@ -315,7 +314,7 @@ public class eBUG_tmp {
             }
         }
 
-        try (FileWriter writer = new FileWriter("fast.csv")) {
+        try (FileWriter writer = new FileWriter("fast2.csv")) {
             // 写入CSV头部
             writer.append("x,y,z\n");
 

Reply via email to