我能想到的更快的方法是创建一个数据结构来反映这个对象的属性值并保存每个值的内部索引。
当搜索一个值时,这个内部数据结构将使用二进制搜索返回索引。
唯一的要求是您的对象必须注册并更新此结构。
类似于以下虚构的 UML/Python 之类的代码:
// Holds the index number of a given value
// for instance, name="Oscar" may be at index 42...
IndexValuePair
index : Int
value : String
+_ new( value: String, index: Int )
return IndexValuePair( value, index )
ValuePairComparator --> Comparator
+ compareTo( a: IndexValuePair, b: IndexValuePair ) : Int
return a.value.compareTo( b.value )
SearchStructure
- data = Object[] // The original array which contains your applicants
// a list of arrays each one containing the property value, and the index on "data" where that value appears
- dataIndexes = List(IndexValuePair)[String] // Map<List<IndexValuePair>>
- dataIndexexInitialized = false
// Add an object to this structure
+ addObject( o: Object )
if( ! dataIndexesInitialized,
initIndexesWith( o )
)
index = data.add( o ) // returns the index at which "o" was inserted
addToIndexes( o, index )
// Register all the properties values of the given object
// along with the index where they appear in the original array
- addToIndexes( object: Object, index: Int )
forEach( property in Object ,
list = dataIndexes[property]
list.add( IndexValuePair.new( property.value, index ) )
)
// Create empty array for each property ..
- initIndexesWith( object : Object )
forEach( property in object ,
comparator = ValuePairComparator()
list = List<IndexValuePair>()
list.setComparator( )
dataIndexes[property] = list
)
dataIndexesInitialized = true
// Search an object using the given criteria ( a Map<String, String> = key=value )
+ search( criteria: String[String] ) : List<Object>
result = Set<Object>()
// let's say criteria has:
// ["name":"Oscar", "lastName"="Reyes"]
forEach( key in criteria,
list = dataIndexes[key] // "name", "lastname" ..etc.
valuePair = list.binarySearch( criteria[key] ) // first Oscar, later Reyes
result.add( data[valuePair.index] )
)
return result
哎呀
我希望这是可以理解的。
关键是,如果你真的要快速拥有这个,你必须按属性保存索引
- 数据的数组
- 每个属性的数组,该数组又包含数据的索引
例如,如果您有以下数组:
a = [ Object(name="Mike", lastName="Z" )
Object(name="Oscar", lastName="Reyes" ) ,
Object(name="Rahul", lastName="G" ) ,
Object(name="Pie", lastName="154" ) ]
他们将拥有以下职位:
0 = Mike ...
1 = Oscar ...
2 = Rahul ...
3 = Pie ...
你将有两个(在这种情况下)单独的数组,在排序后将是:
nameArray = ["Mike=0", "Oscar=1", "Pie=3", "Rahul=2"]
和
lastNameArray = ["154=3", "G=2", "Reyes=1", "Z=0"]
当您搜索给定属性时,您将使用相应的数组,例如,如果您要搜索姓氏“Reyes”,您将使用“lastName”数组
["154=3", "G=2", "Reyes=1", "Z=0"]
并将对其执行 binarySearch 以查找“Reyes”,这将返回位置 2 处的元素,该元素又将返回 index = 1,即“Oscar”在原始数组中的位置。
这应该使事情保持在 O(log n) 以下