in reply to Re^4: Longest Increasing Subset
in thread Longest Increasing Subset
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: Longest Increasing Subset
by BrowserUk (Patriarch) on Oct 24, 2016 at 09:30 UTC | |
I believe this can be reduced to LCS which is O(much better). I concur. My assessment was of the OPs somewhat naive approach to the problem, not the optimal solution. reduced to LCS Careful. LCS can mean either: longest common substring; or -- as is applicable here -- longest common subsequence. And actually, the OPs problem can be further specialised to Longest increasing subsequence, and tackled with a very straight forward algorithm that is O(n log n). With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
by pryrt (Abbot) on Oct 24, 2016 at 14:49 UTC | |
wow... so I implemented the wiki page's pseudocode, and benchmarked my code vs the Longest Increasing Subsequence:
results:
With a random list just twenty elements long, it went from 5-6s per run for my code, to better than 25_000 runs per second with the efficient algorithm: that's almost 150_000 times faster, and that's just with 20 elements in the array. (My original benchmark tried cmpthese() on random length arrays, using the defaults to my genarray() function, but after a minute, I didn't feel like waiting that long, so switched to a 10sec timethese()/cmpthese() pair. Multiple runs give similar results.) When run-time is money, it pays to search for known-good algorithms, rather than just trusting that you've thought of an efficient algorithm! Thanks ++gilthoniel for an interesting thread, and ++BrowserUK, for once again bringing his knowledge of efficient coding practices to help us all. To all who come upon this thread: definitely use the efficient code, rather than my original code! | [reply] [d/l] [select] |
by BrowserUk (Patriarch) on Oct 24, 2016 at 16:06 UTC | |
I also implemented the wiki pseudo-code, resulting almost identical code:
Though I pass the data in via a reference for efficiency. I've been trying to wrap my brain around the mentioned Knuth optimisation without success. One comment on your code. This return wantarray ? @S : [@S]; throws away the advantage of returning a reference, by constructing a list from the existing array, which is then used to construct another (anonymous) array, a reference to which is returned. Better to just do return wantarray ? @S : \@S; With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] [select] |