Я собирался ответить на это высказывание: используйте объект для поиска, затем используйте hasOwnProperty, чтобы определить, установлено ли свойство в фильтре Object.От фактического тестирования моего метода вместе с этими двумя (создание фиктивного набора данных со строками чисел (100 000 из них) и разница между методами с точки зрения времени выполнения незначительна (колеблется между 130 и 160 мс).все три из них имеют одинаковое время выполнения.
Вот мой полный код, так что вы можете возиться и указывать, сделал ли я что-то, что каким-то образом делает недействительным мое тестирование, но мне кажется, что это имеет смысл, используя indexOf, в котором это необходимовыполнять итерацию по набору, пока не найдет объект (в предположении, что линейная коллекция, а не дерево) совпадает с hasOwnProperty (необходимо получить список всех свойств и выполнить итерацию по ним, если только не существует встроенного механизма для более эффективного поиска свойства:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
height="100%"
width="100%"
xmlns:code="http://code.google.com/p/flex-iframe/"
creationComplete="application1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import flash.utils.getTimer;
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
/* private function filterForTestData(item:Object):Boolean{
return filterBy.hasOwnProperty(item);
} */
/* private function filterForTestData(item:Object):Boolean{
return filterBy.indexOf(item) != -1;
} */
private function filterForTestData(item:Object):Boolean{
for(var randomprice in filterBy)
return item == randomprice;
return false;
}
[Bindable]
private var dp:ArrayCollection = new ArrayCollection(['1','2','3','4','5','6','7','8']);
private var filterBy:Object={'10':true,'4':true,'1':true,'8':true};
//private var filterBy:Array= ['10','4','1','8'];
protected function button2_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
var startTime:int = getTimer();
trace(getTimer());
dp.filterFunction = filterForTestData;
dp.refresh();
var endTime:int = getTimer();
trace("total time: " + (endTime-startTime).toString());
}
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
// TODO Auto-generated method stub
for(var i:int=0;i<100000;i++)
{
dp.addItem(Math.floor(Math.random()*100).toString());
}
theList.dataProvider = dp;
}
]]>
</mx:Script>
<mx:List id="theList" width="100"/>
<mx:Button click="button2_clickHandler(event)"/>
</mx:Application>
Я собираюсь попытаться обдумать это с точки зрения чистых данных и посмотреть, возможно ли даже получить лучшее время выполнения, чем это, или это просто природа проблемы, которая требует определенногоколичество проверок (асимптотический анализ).
Хороший вопрос.
[Править] Хорошо, подумав, я думаю, не используя более сложную структуру данных (и не тратя время процессора на предварительные затраты на создание / реорганизациюструктура данных ... думая о сохранении сбалансированного дерева для поиска) Я почти уверен, что любой метод приведет к эквивалентному или худшему времени выполнения, чем эти методы (то есть линейное время выполнения или хуже O (n)).Используя древовидную структуру, вы получите время выполнения O (log n) для поиска, но понесете больше затрат на обработку, чтобы сохранить баланс дерева (выполняя ротации по мере необходимости).Если кто-то может опровергнуть это утверждение, я буду рад, если вы это сделаете, но я верю, что все это правда.
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/binarySearchTree.htm