PDA

Pogčedajte punu verziju : Graph path problem...


LiquidBrain
23. 09. 2009., 02:33
Zdravo, elem citam joe celkovu knjigu i tu se pojavljuje jedan problem koji ne mogu da resim...

naime imam sledecu tabelu:


step_1 | step_2 | step_3 | step_4 | step_5 | total_cost | path_length
--------+--------+--------+--------+--------+------------+-------------
s | s | s | x | y | 11 | 1
s | s | u | v | y | 11 | 2
s | s | u | x | y | 11 | 2
s | s | x | v | y | 11 | 2
s | s | x | x | y | 11 | 0
s | s | x | y | y | 11 | 2
s | u | u | v | y | 11 | 2
s | u | u | x | y | 11 | 2
s | u | v | v | y | 11 | 2
s | u | v | y | y | 11 | 4
s | u | x | v | y | 11 | 4
s | u | x | x | y | 11 | 2
s | u | x | y | y | 11 | 4
s | x | v | v | y | 11 | 2
s | x | v | y | y | 11 | 4
s | x | x | v | y | 11 | 2
s | x | x | x | y | 11 | 1
s | x | x | y | y | 11 | 2
s | x | y | y | y | 11 | 2



ono sto mi treba jeste neka ideja kako da izbacim redove koji su isti. Kada kazem isti mislim na sledece:


s x x v y = s x v v y = s x v y


Neka ideja?

Hvala

bluesman
23. 09. 2009., 02:39
A po kom kriterijumu si tu redovi isti? Ja ne vidim da su isti (u 2:29 am) :)

LiquidBrain
23. 09. 2009., 04:22
recimo ova dva:

s | u | u | v | y | 11 | 2
s | u | v | v | y | 11 | 2


ova dva su ista zato sto ako izbacimo "duple colone" onda dobijemo rezultat

s u v y


znaci meni treba nacin da prikazem ili jedan ili drugi red, nikako oba...

jablan
23. 09. 2009., 07:41
Šta znače te kolone? Jel da ne može da bude više od 4 koraka u putanji? U kojoj ti je strukturi putanja?

Dejan Topalovic
23. 09. 2009., 11:07
Iskreno - nisam skontao pitanje ...

bluesman
23. 09. 2009., 13:32
Ja tek počinjem da razumem :)

Znači ti izbacuješ dupla slova i ostaju samo unique karakteri?

Da li to znači i da je
s u v y = s u y v = y v u s
Ili mora da bude isti redosled ?

Vladimir Rodic
23. 09. 2009., 13:45
Ja tek počinjem da razumem :)

Znači ti izbacuješ dupla slova i ostaju samo unique karakteri?

Da li to znači i da je
s u v y = s u y v = y v u s
Ili mora da bude isti redosled ?

ja mislim daje u pitanju putanja, tako da uzastopno ponavljanje karaktera (tacaka u putanji) moze da se vidi kao jedan karakter
suuuy = suy = suyyy

jablan
23. 09. 2009., 15:15
Drugim rečima, izbacivanje višestrukih karaktera iz stringa? :)

Postgres:
test=# select regexp_replace('asssadddv', E'(.)\\1+', E'\\1', 'g');
regexp_replace
----------------
asadv
(1 row)

LiquidBrain
23. 09. 2009., 15:18
@grocky, upravo to.

@jablan, SQL mi je potreban, ne regexp...

ivanhoe
23. 09. 2009., 16:01
jel moze da se doda nova kolona koja bi bila skup (tip SET), i sadrzavala cvorove ? Onda bi manje vise lako mogao da ih poredis, a i ne bi imao problem sa duplikatima

LiquidBrain
23. 09. 2009., 18:34
moze sta god da treba... :)

holodoc
23. 09. 2009., 18:46
jel moze da se doda nova kolona koja bi bila skup (tip SET), i sadrzavala cvorove ? Onda bi manje vise lako mogao da ih poredis, a i ne bi imao problem sa duplikatimaMada da bi se izbegla redundantnost podataka može od postojeće tabele da se napravi privremena TEMPORARY tabela kao kopija postojeće sa sve generisanim privremenim podacima. Implemetacija ovoga nažalost zavisi od platforme koja se koristi (MySQL, Oracle?) :)

japan
23. 09. 2009., 19:56
Evo poigrao sam se malo grubom silom u MySQL-u:


DELIMITER $$

DROP FUNCTION IF EXISTS `test`.`simple_path`$$
CREATE FUNCTION `test`.`simple_path` (path char(20)) RETURNS char(20)
BEGIN
DECLARE counter INT DEFAULT 2;
DECLARE simple_path char(20) DEFAULT SUBSTR(path, 1, 1);

WHILE counter <= CHAR_LENGTH(path) DO
IF SUBSTR(path, counter-1, 1) <> SUBSTR(path, counter, 1) THEN
set simple_path = CONCAT(simple_path, SUBSTR(path, counter, 1));
END IF;
SET counter = counter + 1;
END WHILE;

RETURN simple_path;
END$$

DELIMITER ;

select distinct simple_path(concat(step_1, step_2, step_3, step_4, step_5)) from test


Valjda je to to, jedino bi mozda trebalo podesiti ulazni i izlazni tip, ako sam uopste dobro shvatio...

Dejan Topalovic
25. 09. 2009., 00:17
Je l' ti moze ovo ista pomoci?
select distinct
concat(
step_1,
IF(step_1 = step_2, '', step_2),
IF(step_2 = step_3, '', step_3),
IF(step_3 = step_4, '', step_4),
IF(step_4 = step_5, '', step_5)
) as path,
total_cost,
path_length
from tvoja_tabela;

Napomena: Ovo je za MySQL. Ako treba za Oracle, moze i to sutra. :D

Dejan Topalovic
29. 09. 2009., 11:58
I jesi nasao rjesenje?

LiquidBrain
29. 09. 2009., 15:18
nisam,

ceo clanak se nalazi ovde, pa koga interesuje...

http://www.dbazine.com/ofinterest/oi-articles/celko13

Hvala svakako...

Dejan Topalovic
29. 09. 2009., 23:12
Procitao sam clanak, ali mi nije bas sve jasno... Npr. zasto ovaj red:
(s, s, s, x, y, 11, 1)
ima path_length 1, a ovaj red:
(s, x, y, y, y, 11, 2)
ima path_length 2, ako su nakon skracivanja cvorova (na "sxy") ekvivalentni?


Ne mozes nista iskombinovati sa gorenavedenim rjesenjem koristeci CONCAT?