cuốn sách gpt4 ai đã làm

php - Chuyển đổi dữ liệu thời gian: [Khoảng cách, tốc độ] thành dữ liệu khoảng cách: [Thời gian, tốc độ]

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 05:46:26 29 4
mua khóa gpt4 Nike

Tôi đang gặp sự cố khi đưa ra thuật toán...

Tôi có một loạt dữ liệu GPS ghi lại thời gian, tốc độ, khoảng cách trong khoảng thời gian 1 giây. Giả sử khoảng cách là mét và tốc độ là mét/giây. Có thể có hơn 2 giờ dữ liệu hoặc 7200 điểm. Trường "thời gian" ở đây chủ yếu được sử dụng làm tài liệu tham khảo.

Vì vậy, 5 giây đầu tiên sẽ giống như thế này, trong đó [1-5] là giây.

$dữ liệu = mảng(
1 : mảng('khoảng cách'=>0, 'thời gian'=>'2014-01-09 17:50:00', 'tốc độ'=>0.0),
2: mảng('khoảng cách'=>2, 'thời gian'=>'2014-01-09 17:50:01', 'tốc độ'=>2.0),
3: mảng('khoảng cách'=>6, 'thời gian'=>'2014-01-09 17:50:02', 'tốc độ'=>4.0),
4: mảng('khoảng cách'=>10, 'thời gian'=>'2014-01-09 17:50:03', 'tốc độ'=>4.0),
5 : mảng('khoảng cách'=>12, 'thời gian'=>'2014-01-09 17:50:04', 'tốc độ'=>2.0)
);

Tôi muốn chuyển đổi dữ liệu này thành dữ liệu được liệt kê trong khoảng cách 1 mét, ví dụ [1-6] là mét.

$dữ liệu = mảng(
1 : mảng('giây'=>1.5, 'thời gian'=>'2014-01-09 17:50:01.500', 'speed'=>.666),
2 : mảng('giây'=>2, 'thời gian'=>'2014-01-09 17:50:02', 'tốc độ'=>2.0),
3 : mảng('giây'=>2.25, 'thời gian'=>'2014-01-09 17:50:02.250', 'tốc độ'=>4.0),
4 : mảng('giây'=>2.5, 'thời gian'=>'2014-01-09 17:50:02.500', 'tốc độ'=>4.0),
5 : mảng('giây'=>2.75, 'thời gian'=>'2014-01-09 17:50:02.750', 'tốc độ'=>4.0),
6: mảng('giây'=>3, 'thời gian'=>'2014-01-09 17:50:03', 'tốc độ'=>4.0)
);

Tất nhiên điều này có thể được thực hiện mà không cần có trường thời gian. Tôi gặp khó khăn khi tính toán điều này vì nó chắc chắn không phải là một đối một. Nếu chúng tôi bắt đầu với 7200 giây dữ liệu, chúng tôi có thể kết thúc với nhiều hoặc ít dữ liệu hơn tùy thuộc vào khoảng cách được bao phủ (nhiều hơn hoặc ít hơn 7200 mét).

Biên tập viên (10/01/2014)

Dưới đây là cách thực hiện thực tế của hai phương pháp này. Thực ra, tôi đang gặp khó khăn trong việc quyết định xem mình thích cách tiếp cận nào hơn, lặp đi lặp lại hay đệ quy. Tôi có thể lặp lại

Phương pháp 1, lặp lại (@Ezequiel Muns, tôi đã thực hiện những sửa đổi rất nhỏ):

hàm timeToDistance($data) {
if(sizeof($data) == 0){ return }
$startTime = $data[0]['time'];

$prev = null;
$kết quả = mảng();
foreach ($dữ liệu dưới dạng $secs => $row) {
$row['seconds'] = $secs; // để đơn giản hóa việc truyền trong vài giây
nếu ($ trước == null) {
// đảm bảo chúng ta có một cặp
$prev = mảng( 'khoảng cách'=>0 );
}
foreach (distanceRowsBetween($startTime,$prev, $row) as $dist => $distRow) {
$result[$dist] = $distRow;
}
$prev = $row;
}
trả về kết quả $;
}

hàm distanceRowsBetween($startTime,$prevRow, $nextRow) {
// Trả về các hàng theo khoảng cách nằm giữa $prevRow (độc quyền)
// và $nextRow (bao gồm)
$rows = array();
$currDist = $prevRow['distance'];
while (true) {
// cố gắng di chuyển đến toàn bộ đơn vị khoảng cách tiếp theo
$dDist = ceil($currDist) - $currDist;
$dDist = $dDist == 0.0? 1.0 : $dDist; // dDist là 1 đơn vị nếu currDist là toàn bộ
$currDist += $dDist;
if ($currDist > $nextRow['distance'])
phá vỡ;

$currSpeed ​​​​= $nextRow['speed'];
$currSecs = strtotime($nextRow['time']) - strtotime($startTime);
$currTime = $nextRow['time'];

$rows[$currDist] = mảng(
'tốc độ' => $currSpeed,
'giây' => $currSecs,
'thời gian' => $currTime,
);
}
trả về hàng $;
}

Phương pháp 2, đệ quy (@Nathaniel Ford mã giả, mã thực tế của tôi):

hàm data2dist($time_data = array()){
$dist_data = mảng();
if(sizeof($time_data) == 0){ return $dist_data }

$start_point = array_shift($time_data);
$start_time = $start_point['time'];

data2dist_sub($start_time, $time_data,$dist_data,$start_point);

trả về $dist_data;
}

hàm data2dist_sub($start_time,&$time_data, &$dist_data, $start_point = array()){
if(sizeof($time_data) == 0 && !isset($start_point)){
return;
}

if(sizeof($dist_data) == 0){
$prev_dist = 0;
} khác {
$prev_dist = $dist_data[sizeof($dist_data)-1]['distance'];
}
// vì khoảng cách đang được tích lũy, hãy lấy khoảng cách hiện tại bằng cách trừ đi khoảng cách cuối cùng
$point_dist = $start_point['distance'] - $prev_dist;

if($point_dist == 1){
// chính xác là 1: hoàn hảo, thêm và tiếp tục
$dist_data[] = $start_point;
$start_point = array_shift($time_data);
} khác nếu($point_dist > 1){
// lớn hơn 1: loại bỏ hiệu quả 1 khỏi điểm hiện tại và gửi nó về phía trước
$partial_point = $start_point;
$partial_point['distance'] = 1 + $prev_dist;
$dist_data[] = $partial_point;

} khác nếu($point_dist < 1){
// nhỏ hơn 1, chuyển sang mục tiếp theo và tiếp tục (nhỏ: tốc độ một phần này được hấp thụ vào mục tiếp theo)
$start_point = array_shift($time_data);
if(!isset($start_point)){ return }

$start_point['distance'] += $point_dist;
}
data2dist_sub($start_time,$time_data,$dist_data,$start_point);
}

câu trả lời hay nhất

Bạn có thể đơn giản hóa điều này bằng cách lưu ý rằng đối với mỗi cặp hàng theo thời gian liên tiếp, bạn cần tính 0 hoặc nhiều hàng theo khoảng cách và những hàng này chỉ phụ thuộc vào hai hàng theo thời gian này.

Vì vậy, phép tính đơn giản hơn này bắt đầu bằng một hàm, một khung loại bỏ phép tính các giá trị Giây, Tốc độ và Thời gian đã chuyển đổi để đơn giản.

hàm distanceRowsBetween($prevRow, $nextRow) {
// Trả về các hàng theo khoảng cách nằm giữa $prevRow (độc quyền)
// và $nextRow (bao gồm)
$rows = array();
$currDist = $prevRow['distance'];
while (true) {
// cố gắng di chuyển đến toàn bộ đơn vị khoảng cách tiếp theo
$dDist = ceil($currDist) - $currDist;
$dDist = $dDist == 0.0? 1.0 : $dDist; // dDist là 1 đơn vị nếu currDist là toàn bộ
$currDist += $dDist;
if ($currDist > $nextRow['distance'])
phá vỡ;

// tính $currSecs ở khoảng cách $currDist
// tính $currSpeed
// tính toán $currTime

$rows[$currDist] = mảng(
'tốc độ' => $currSpeed,
'giây' => $currSecs,
'thời gian' => $currTime,
);
}
trả về hàng $;
}

Bây giờ bạn đã có điều đó, tất cả những gì còn lại là lặp lại từng cặp liên tiếp trong đầu vào và tích lũy các hàng kết quả theo khoảng cách:

hàm timeToDistance($data) {
$prev = null;
$kết quả = mảng();
foreach ($dữ liệu dưới dạng $secs => $row) {
$row['seconds'] = $secs; // để đơn giản hóa việc truyền trong vài giây
nếu ($ trước == null) {
$prev = $row; // đảm bảo chúng ta có một cặp
continue;
}
foreach (distanceRowsBetween($prev, $row) as $dist => $distRow) {
$result[$dist] = $distRow;
}
$prev = $row;
}
trả về kết quả $;
}

Lưu ý rằng trong hàm này, tôi đang điền và chuyển giá trị "giây" hiện tại từ hàng để giảm số lượng đối số được truyền cho hàm trước đó.

Về php - Chuyển đổi dữ liệu thời gian: [Khoảng cách, tốc độ] thành dữ liệu khoảng cách: [Thời gian, tốc độ], chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/21033188/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress