※ 引述《eco100 (Maktub)》之銘言:
: 我的問題是這樣的
: 我有兩個table如下
: table1: table2:
: no. start_1 end_1 name start_2 end_2
: 1 3 5 A 1 6
: 2 4 6 B 7 10
: 3 11 13 C 11 15
: 4 12 14
我的作法也很單純,在數線上行走,同時篩出 tbl1 / tbl2 裡相對應的數據
底下是虛擬碼,請視需要實做
主要是透過對 start 排序,一次讀入多筆 table1 的資料,取出不重疊的部份
// 底下兩個 iterator 除了各有 name start, end 的屬性以外,
// 還可以用 .next() 跳成下一筆,並且用 .end() 驗證是否迭代完畢
// t1i 為 table1 之 iterator
$t1i = $table1.OrderBy('start_1') ;
// t2i 為 table2 之 iterator
$t2i = $table2.OrderBy('start_2') ;
// 計算 t1 目前空槽,如果有負數的話記得把初始值改掉
// 下一個區域不用儲存,因為 Start 就是 $t1i.start
$CurrentZoneStart = 0 ;
$CurrentZoneEnd = 0;
// 迭代直到其中一個跑完
while (!($t1i.end() || $t2i.end())) {
// 第一部份,累進 $t1i 直到空槽
$CurrentZoneStart= $t1i.start ;
$CurrentZoneEnd = $t1i.end ;
$t1i.next() ;
while($t1i.start < $CurrentZoneEnd) {
$CurrentZoneEnd = max($CurrentZoneEnd, $t1i.end) ;
$t1i.next() ;
}
// 第二部份,找出在目前空槽 ($CurrentZoneEnd, $t1i.start) 內的 t2
while ($t2i.start < $t1i.start) { // 下個洞再檢查
if (($t2i.start > $CurrentZoneEnd) && ($t2i.end < $t1i.start)) {
echo $t2i.name ."\n" ;
} else $t2i.next() ;
}
}
// 耶,寫完了耶,打錯字不負責
--
鬼壓床怎麼辦
騎上去啊
Blog: http://clifflu.blogspot.com/ Since March, 2007
Photo Galelry: http://www.picasaweb.com/clifflu 沒有了 T_T
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.190