Wpis z mikrobloga

#naukaprogramowania #golang
https://www.toptal.com/developers/hastebin/satuwafape.go

ktoś mi może powiedzieć czemu ten if zawsze przechodzi, przez co nie mogę znaleść ostatniego skończonego taska?
lista tasków na której to testuje: https://www.toptal.com/developers/hastebin/elazabodis.json

wiem że godziny mogą być trochę nieaktualne w momencie pisania, ale nie działało tak samo jak były aktualne ( ͡° ͜ʖ ͡°)

do funkcji przekazuję posortowaną tablicę (sprawdzałem sortowanie, działa)
  • 18
@RedveKoronny: wszystkie daty w jsonie nawet po zmianie na 27 to daty przeszłe. Więc zawsze będą przed aktualną datą.

Poza tym jeśli masz posortowana listę to ostatni rozpoczęty task będzie pierwszym albo ostatnim elementem tablicy zależnie od kierunku sortowania. Binary search służy do szybkiego znalezienie elementu w posortowanej tablicy poprzez porównywanie jej elementów. Aktualna data nie jest elementem Twojej tablicy.
@RHarryH: ta, ale jak odwróciłem tablicę (żeby zwróciło pierwszego, a nie ostatniego taska) to problem był ten sam.
Generalnie sortowanie i wyszukiwanie musi albo patrzeć metodą after, albo before, nigdy jedno w przód a drugie w tył
@RedveKoronny: wydaje mi się, że mylisz algorytmy sortujące z algorytmami wyszukującymi. Żeby znaleźć ostatnio wystartowany task należałoby posortować tablice i wybrać pierwszy lub ostatni jej element. Do tego masz insertion czy bubble sort. Binary search szuka konkretnego elementu w tablicy. U Ciebie tym elementem jest now. Takiego elementu nie ma w tablicy więc wychodzą Ci głupoty.
@RHarryH:

Żeby znaleźć ostatnio wystartowany task należałoby posortować tablice i wybrać pierwszy lub ostatni jej element.


ostatnia linijka mojego wpisu

do funkcji przekazuję posortowaną tablicę (sprawdzałem sortowanie, działa)


+ sprawdzanie tylko 2 elementów jest bez sensu, jeżeli nie zakładam że wszystko mam do zrobienia/jest już zrobione
@RedveKoronny: jeśli masz założenie że to funkcji wpada posortowana tablica to jej jedynym zadaniem jest po prostu pobranie elementu z tablicy. Jeśli sortowanie było rosnąco (od najwcześniejszej do najpóźniejszej daty) to ostatni element będzie najpóźniej wystartowanym taskiem. Jeśli Twoje sortowanie sortuje malejąco to będzie to pierwszy element. Tyle.

Binary search jest od czego innego. On szuka konkretnego elementu, którym u Ciebie jest "now". Żaden task w Twojej tablicy nie ma i
@RHarryH:

Żaden task w Twojej tablicy nie ma i nie będzie miał takiej wartości więc binary search nie znajdzie nic.


a to ciekawe, bo wyżej jest też mój komentarz, że zmieniłem jedną rzecz przy wyszukiwaniu, i znajduje dokładnie to czego szukam. Ostatniego rozpoczętego taska.

mam listę tasków na dany dzień.
sortuję je od najwcześniejszego, do najpóźniejszego, jeśli chodzi o godzinę o której mam go wykonać.
Binary searchem znajduję punkt pomiędzy 2
@RHarryH: bo nie mam opcji żebym nie znalazł elementu, tak długo jak w tablicy jest co najmniej 1 element.
Jak inaczej proponujesz nazwać algorytm, który wyszukuje element spełniający konkretne założenia, partycjonując tablice na połowy?
@RHarryH: nie testowałem, pisze z telefonu ale tutaj masz lepszą wersję binary searcha. Ale dalej uważam, że nie jest on tutaj potrzebny.

func findrecenttask(arr []Task) ( int) {
start := 0
end := len(arr) - 1

if end <=0 {
return 0
}

now := time.Now()
// binary search for recent done task
for (end - start) > 1 {
i := (end+start) / 2
if(arr[i].Started.Before(now)){
start = i
@RHarryH: dalej nie rozumiesz co chcę zrobić.

wiem że dostałem niepustą, posortowaną tablicę tasków.
Szukam taska poprzedzającego pierwszego taska, który jeszcze się nie zaczął.

Binary searchem znajduję punkt pomiędzy taskami (n, n+1)
n+1 to pierwszy nierozpoczęty task
zwracam więc element nr n, ponieważ on jest ostatnim który się rozpoczął
@RHarryH: problem się naprawił, kiedy zacząłem sortować, i wyszukiwać tą samą metodą.

func sorttasks(arr []Task) ([] Task) {
sort.SliceStable(arr, func(i, j int) bool{
return arr[i].StartsAt.Before(arr[j].StartsAt) // ta linia
})
return arr
}

func find
recent_task(arr []Task) ( int) {
start := 0
end := len(arr) - 1

if end <=0 {
return 0
}

now := time.Now()
// binary search for recent done task
for (end - start) > 1
@RedveKoronny: ok czyli chcesz znaleźć taska, który pierwszy w kolejności wystartuje ale jeszcze tego nie zrobił? Faktycznie źle Cię rozumiałem. Ale i tak nazywanie tego algorytmu w funkcji find binary searchem uważam w takim razie za niewłaściwe bo to nie jest do końca binary search.

Upewnij się czy wszystkie przypadki graniczne Ci działają.