shilling for my feature request [1926]

Alex Tweedly alex at tweedly.net
Sun Aug 22 19:27:23 EDT 2004


At 15:46 22/08/2004 -0700, Mark Brownell wrote:


>So let's say that you have hundreds of points either in an array or comma 
>delimited. What would be the fastest way to get the value of the item just 
>less than 100 in this following example?
>
>1, 34, 67, 99, 109, 121, 133, 144, 155, (answer = item 4) -- 99
>
>Would I have to loop through each one checking each during a repeat for 
>the last item less-than 100 or is there a faster way to get the value in 
>item 4. Every time I can drop a repeat loop seems to be a way to optimize 
>the result based on speed issues.

If you have only have hundreds of points, then a loop may not be too bad.

However, since you know that data is ordered, you have other options.

If you have many hundreds, or thousands, then I would try out a binary 
search and compare its times to the simple repeat loop.

If you are enthusiastic, I'd try out a linear interpolation search as well 
- given the nature of the data, this might be noticeably better on average 
than binary search (but of course would be much worse in the worst case).

If you have many thousands, and you will be searching in the same data 
repeatedly, then you might build a balanced binary index tree or something 
more complicated - but you'd need to be very dependent on speed to consider 
this (and so you'd probably be better building an external to do it).

But a more fundamental question - why would you want to know that ? :-)

I'd guess it's because you have something like ....

    put the offsets of "<a>" of theText into tOff1
    put the offsets of "</a>" of theText into tOff2

and then your working through tOff2, find a value of 100 and want to find 
the matching (i.e. preceding) occurrence in tOff1.

You might consider doing something like ....
     repeat for each line L of tOff1
         put L & comma & "<a>" after tAllOff
     end repeat
     repeat for each line L of tOff2
        put L & comma & "</a>" after tAllOff
    end repeat
    sort tAllOff by item 1
and then working on the combined offset list.

Hmmmm - so maybe it would be worth asking for a single function to take a 
list of strings and put their offsets into a single list :
     put the offsets of "<a>,</a>" of myText into tAllOff
which would put
    1, <a>
    4, </a>
    9, <a>
   11, <a>
   25, </a>
   ... etc.
  into the list.   i.e. somewhat like  the earlier "split by string1 and 
string2" idea.

-- Alex.


More information about the use-livecode mailing list