sort n integers of range 0~n^2-1 in O(n) time

本文介绍了如何使用基数排序算法来解决一个特定的算法问题,包括实现步骤和代码示例。

This is one problem introduced in "Introduction to Algorithm".

We can use radix-sort to solve it.

 

package alg;

import java.util.ArrayList;
import java.util.Iterator;

/*
 * This example shows how to use radix sort algorithm to sort N integers in the range of 0 ~ N^2-1.
 */
public class RadixSortExample {

    void sort(int a[], int N){
        int len = a.length;
        
        ArrayList<ArrayList<Integer>> bucket= new ArrayList<ArrayList<Integer>>(N);
        for(int i = 0; i<N;i++){
            bucket.add(new ArrayList<Integer>(len));
        }
        ArrayList<Integer> temp = new ArrayList<Integer>(len);
        
        for(int i = 0; i< len; i++){
            temp.add(new Integer(a[i]));
        }
        for(int i = 0; i<len; i++){
            int digit0 = temp.get(i).intValue() % N;
            bucket.get(digit0).add(temp.get(i));
        }
        temp.clear();
        
        for(int i = 0; i<N; i++){
            Iterator<Integer> it = bucket.get(i).iterator();
            while(it.hasNext()) temp.add(it.next());
        }
        for(int i = 0; i<N;i++){
            bucket.get(i).clear();
        }
        for(int i = 0; i<len; i++){
            int digit1 = temp.get(i).intValue() / N;
            bucket.get(digit1).add(temp.get(i));
        }
        temp.clear();
        for(int i = 0; i<N; i++){
            Iterator<Integer> it = bucket.get(i).iterator();
            while(it.hasNext()) temp.add(it.next());
        }
        Iterator<Integer> it = temp.iterator();
        while(it.hasNext()) System.out.println(it.next());
        
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a []= {63,20,43,15,56,9,1,28};
        RadixSortExample r = new RadixSortExample();
        r.sort(a,8);
    }

}

 

import json import os import numpy as np from datetime import datetime, timedelta import matplotlib.pyplot as plt from scipy.spatial.distance import directed_hausdorff from PIL import Image, ImageDraw # 轨迹点数据结构 class TrajectoryPoint: def __init__(self, x, y, angle=None): self.x = x self.y = y self.angle = angle def to_array(self): return np.array([self.x, self.y]) # 图像轨迹数据类 class ImageTrajectoryData: def __init__(self, timestamp, image_path, roadpoints): self.timestamp = datetime.strptime(timestamp, &#39;%Y-%m-%d %H:%M:%S.%f&#39;) self.image_path = image_path self.roadpoints = [TrajectoryPoint(p[0], p[1], p[2] if len(p) > 2 else None) for p in roadpoints] self.label = "no" # 默认标签 def trajectory_array(self): return np.array([p.to_array() for p in self.roadpoints]) # 轨迹分析器 class TrajectoryAnalyzer: def __init__(self, jsonl_path, output_dir): self.jsonl_path = jsonl_path self.output_dir = output_dir self.data = [] os.makedirs(output_dir, exist_ok=True) def load_and_sort_data(self): """加载JSONL文件并按时间戳降序排序""" with open(self.jsonl_path, &#39;r&#39;,encoding=&#39;utf-8&#39;) as f: for line in f: entry = json.loads(line) img_data = ImageTrajectoryData( entry[&#39;timestamp&#39;], entry[&#39;image_path&#39;], entry[&#39;mop_pnc_info&#39;][&#39;roadpoints&#39;] ) self.data.append(img_data) # 按时间戳降序排序(最新在前) self.data.sort(key=lambda x: x.timestamp, reverse=True) print(f"Loaded {len(self.data)} records, sorted by timestamp (descending)") def plot_trajectory(self, img_data, index): """绘制轨迹路线图并保存""" img = Image.open(img_data.image_path) draw = ImageDraw.Draw(img) width, height = img.size # 绘制轨迹点 for i, point in enumerate(img_data.roadpoints): # 转换为图像坐标(假设轨迹点在0-1范围) x = int(point.x * width) y = int(point.y * height) # 绘制点 radius = 5 draw.ellipse([x - radius, y - radius, x + radius, y + radius], fill=&#39;red&#39;) # 绘制方向(如果有角度) if point.angle is not None: length = 20 end_x = x + length * np.cos(point.angle) end_y = y + length * np.sin(point.angle) draw.line([x, y, end_x, end_y], fill=&#39;blue&#39;, width=2) # 绘制标签 draw.text((10, 10), f"Label: {img_data.label}", fill=&#39;green&#39;) draw.text((10, 30), f"Time: {img_data.timestamp}", fill=&#39;green&#39;) # 保存图像 output_path = os.path.join(self.output_dir, f"traj_{index}.png") img.save(output_path) return output_path def hausdorff_distance(self, traj1, traj2): """计算两条轨迹的Hausdorff距离""" if len(traj1) == 0 or len(traj2) == 0: return float(&#39;inf&#39;) return max(directed_hausdorff(traj1, traj2)[0], directed_hausdorff(traj2, traj1)[0]) def detect_trajectory_changes(self, threshold=0.1): """检测轨迹变化点并打标签""" # 从最新向最旧遍历(索引0是最新) for i in range(len(self.data) - 1): current = self.data[i] next_data = self.data[i + 1] # 计算轨迹相似度 dist = self.hausdorff_distance( current.trajectory_array(), next_data.trajectory_array() ) # 检测显著变化 if dist > threshold: print(f"轨迹变化检测于 {current.timestamp}, 距离: {dist:.4f}") # 标记变化点及前3秒 change_time = current.timestamp for j in range(i, len(self.data)): if (change_time - self.data[j].timestamp) <= timedelta(seconds=3): self.data[j].label = "yes" else: break # 超过3秒停止 def process_and_save(self): """处理所有数据并保存结果""" # 检测轨迹变化 self.detect_trajectory_changes() # 绘制所有轨迹图并更新JSONL output_jsonl = [] for i, img_data in enumerate(self.data): # 绘制轨迹图 img_path = self.plot_trajectory(img_data, i) # 更新JSONL条目 output_entry = { "timestamp": img_data.timestamp.strftime(&#39;%Y-%m-%d %H:%M:%S.%f&#39;), "image_path": img_path, "mop_pnc_info": { "roadpoints": [[p.x, p.y, p.angle] for p in img_data.roadpoints], "label": img_data.label # 添加标签 } } output_jsonl.append(json.dumps(output_entry)) # 保存更新后的JSONL文件 output_path = os.path.join(self.output_dir, "labeled_data.jsonl") with open(output_path, &#39;w&#39;) as f: f.write("\n".join(output_jsonl)) print(f"处理完成! 结果保存至: {output_path}") # ===== 使用示例 ===== if __name__ == "__main__": # 创建示例JSONL文件(实际应用中替换为真实文件路径) jsonl_path = "240426F_gt_all_scenes_frames_lines_m5_hs_dz5_train_fisheye4_240729.jsonl" output_dir = "./output" # 创建分析器并运行 analyzer = TrajectoryAnalyzer(jsonl_path, output_dir) analyzer.load_and_sort_data() analyzer.process_and_save() 报错: entry[&#39;mop_pnc_info&#39;][&#39;roadpoints&#39;] ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ TypeError: list indices must be integers or slices, not str
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值