【发布时间】:2021-08-10 20:34:06
【问题描述】:
我正在实施一种搜索算法,我想显示从最相关到最不相关的结果。我有一组配置文件,我想从中获取配置文件 ID 的OrderedSet,按相关性排序。我的分类,从最相关到最不相关,是:
completeMatchfirstWordMatchnotFirstWordMatchfirstWordContainsnotFirstWordContainssocialContains
我可以在个人资料上致电profiles.reduce(into: // Intermediate model) { ... } 来执行此操作。但是,我想知道我的中间模型应该是什么,然后我会将其转换为配置文件 ID 的 OrderedSet:
- 由配置文件 ID 和分类组成的元组数组作为枚举:
enum SearchResult: Int {
case completeMatch = 0
case firstWordMatch = 1
case notFirstWordMatch = 2
case firstWordContains = 3
case notFirstWordContains = 4
case socialContains = 5
}
let results: [(Profile.ID, SearchResult)] = profiles
.reduce(into: [(SentProfile.ID, SearchResult)]()) { /* ... */ }
searchResults: OrderedSet<Profile.ID> = .init(
results
.sorted { lhs, rhs in
let (_, lhsClassification) = lhs
let (_, rhsClassification) = rhs
return lhsClassification.rawValue < rhsClassification.rawValue
}
.map { profileID, _ in profileID }
)
- 或将每个分类的结构作为独立的有序集:
struct SearchResult {
var completeMatch: OrderedSet<SentProfile.ID> = []
var firstWordMatch: OrderedSet<SentProfile.ID> = []
var notFirstWordMatch: OrderedSet<SentProfile.ID> = []
var firstWordContains: OrderedSet<SentProfile.ID> = []
var notFirstWordContains: OrderedSet<SentProfile.ID> = []
var socialContains: OrderedSet<SentProfile.ID> = []
func joined() -> OrderedSet<SentProfile.ID> {
return completeMatch
.union(completeMatch)
.union(firstWordMatch)
.union(notFirstWordMatch)
.union(firstWordContains)
.union(notFirstWordContains)
.union(socialContains)
}
}
let results: SearchResult = profiles
.reduce(into: SearchResult()) { /* ... */ }
searchResults = searchResults.joined()
我主要关心的是时间复杂度,我似乎无法确定两者之间哪个更好。
【问题讨论】:
-
在最近的 SDK 中枚举自动合成
Comparable,因此您可以直接比较它们而无需访问它们的原始值(因为它们默认从 0 开始,您甚至不需要指定它们的原始值,甚至使它们符合 Int)
标签: swift time-complexity