I have an array with 20000 records, where I want to extract all records,
which either "begins with" or "contains" a search string.

From your description I presume your array is of the form:

tArray[<key_1>] = <some string>
tArray[<key_2>] = <some string>
...
tArray[<key_n>] = <some string>

From this you want to do this:

repeat for each key tKey in tArray
  if tArray[tKey] begins with tSearchString or \
     tArray[tKey] contains tSearchString then
    put tKey & return after tResults
  end if
end repeat

If this is the case, then the above is pretty much the best you can do. The critical step (the one which dominates any execution time) will be the 'begins with' and 'contains' operation - and there is little you can do to speed these up *unless* there are constraints on the search string.

For example, if you are actually just wanting to search for single 'words' in the records then you can pre-index all the words in the array:

-- Build Index
repeat for each key tKey in tArray
  repeat for each word tWord in tArray[tKey]
    put tKey & return after tIndex[tWord]
  end repeat
end repeat

-- Search for word tSearchWord
put tIndex[tSearchWord]

One thing to note is that 20000 records isn't all that many in the modern context - so a linear search is probably not going to cause you too many problems. However, if you are looking at this figure increasing in orders of magnitude then at some point you should probably consider moving to an SQLite database or something similar to store the data. SQLite supports a 'full text search' index system, which enables fast searches for (albeit somewhat restricted) input strings and patterns.

Warmest Regards,

Mark.

--
Mark Waddingham ~ m...@livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to