[#5322] O(1) performance for insertions/deletions at the front of an Array/String — Eric Mahurin <eric_mahurin@...>
I just did some benchmarks on push, pop, shift, and unshift
On Fri, 1 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
On Sat, 2 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
On Sun, 3 Jul 2005, Eric Mahurin wrote:
--- Mathieu Bouchard <matju@artengine.ca> wrote:
Hi,
--- Yukihiro Matsumoto <matz@ruby-lang.org> wrote:
Hi,
Yukihiro Matsumoto wrote:
--- Florian Gro<florgro@gmail.com> wrote:
Eric Mahurin wrote:
--- Nikolai Weibull
Eric Mahurin wrote:
[#5388] Problem with socket communications on Windows — "Jim McMaster" <jim.mcmaster@...>
I recently installed PGP 9.0 on my Windows XP SP2 machine. At that point,
[#5391] Object#=~ — Ryan Davis <ryand-ruby@...>
Since Rexexp#=~ and String#=~ return nil if they fail to match,
Hi,
Hi,
--- Yukihiro Matsumoto <matz@ruby-lang.org> wrote:
[#5409] socket.c - s_recvfrom — Zach Dennis <zdennis@...>
If I am reading s_recvfrom correctly in can throw an error which kills
[#5420] Sydney Developer Preview 1 released — Evan Webb <evanwebb@...>
Sydney, an experimental ruby interpreter, has been released!
Thanks everyone for the feedback so far!
Hi,
The MD5 sum is 53d1bde4542365caf4849c56e6274617.
Hi,
On 7/12/05, nobuyoshi nakada <nobuyoshi.nakada@ge.com> wrote:
Hi,
Hello,
[#5445] GC tweak — Stefan Kaes <skaes@...>
I have found that the performance of current garbage collector
[#5451] bug in pstore (ruby 1.8.2) on Windows ( Win XP) ? — noreply@...
Bugs item #2101, was opened at 2005-07-14 15:30
[#5470] Bogus age value from Etc — Daniel Berger <Daniel.Berger@...>
Hi all,
[#5471] make fail; ruby v182 not finding readline ? — OpenMacNews <OpenMacNews@...>
hi all,
[#5476] Bug in ruby's command line parsing — Lothar Scholz <mailinglists@...>
Hello,
On Sat, Jul 16, 2005 at 10:11:34AM +0900, Lothar Scholz wrote:
[#5492] ruby ( v183) bcc32: using Socket.new with timeout -> files not closed — noreply@...
Bugs item #2131, was opened at 2005-07-19 17:34
Re: O(1) performance for insertions/deletions at the front of an Array/String
--- Mathieu Bouchard <matju@artengine.ca> wrote: > On Fri, 1 Jul 2005, Eric Mahurin wrote: > > > 3. unshift has O(1) performance when you unshift no more > than > > the amount you have shifted. I'd assume it just > decremented > > the start of array pointer. When you unshift more than you > > shifted, it is O(n), physically moving the data to the > right. > > The O(n) problem happens because when unshift is physically > moving the > data to the right, it does it by a fixed number of elements. > Instead, it > should do it by a percentage of the current size, which is > would make it > an amortized O(1). The actual percentage used has influence > on the time > constant. > > I agree that Ruby should do it in amortized O(1). Not exactly what I was thinking. I was thinking that when you try to unshift and you have no free space available to the left, you'd reallocate to a new area growing by a certain percentage - just like you do when you run out of space on the right. But, what you say should work just as well. As long as most of the time all insertions/deletions at the ends of the array/string are O(1) and only every O(n) operations do you have an operation that takes O(n) time. This way the average is still O(1) as you say. The exact O(1) average performance of pushes/pops vs. unshifts/shifts should just be a matter of what percentage of free space you choose to make when you run out of capacity on the left and on the right. I'd like to see these the same, but you may want to give more space on the right since more people probably use pushes over unshifts now because of the performance. > > c. if shifts/unshifts can be made just as fast as > pushes/pops, > > you could cut the average time in half for random > insertions > > and deletions. > > This is a bright idea! I vote for it! Glad you like it. I wonder if any other high-level languages do something like what I'm talking about with their standard stretchable arrays and strings. To designate this new performance of unshifts, maybe a new method should be added to Array and String: ">>". This would prepend/unshift a single element just like << appends/pushes a single element. OT a little ... regarding insertion/deletion do you think we can also make a few methods in String vs Array a little more consistent: a. String#insert - make it also take a list of characters like Array#insert takes a list of elements. Right now if you want to insert a single character, you have to create a String object with that single character. I use [,0]= right now since the interface is the same between Array/String. b. provide a String#delete_at just like Array#delete_at. Not a big deal since slice! works fine, but delete_at would probably be a little more efficient since it isn't so overloaded. c. provide push, pop, shift, unshift to String. Not a big deal since you can use random insert/delete methods, but they may be a little more efficient. d. OT even more ... allow Array#index and Array#rindex to take an optional start index like String#index and String#rindex. ____________________________________________________ Yahoo! Sports Rekindle the Rivalries. Sign up for Fantasy Football http://football.fantasysports.yahoo.com