【问题标题】:find element quickly in a sorted array在有序数组中快速查找元素
【发布时间】:2016-09-25 10:58:16
【问题描述】:

我有一个排序的字符串数组。有没有一种快速的方法来查找这个数组中的元素?

我想优化以下功能。时间太长了传递的数组并不长(只有大约 15-20 个元素),但它被调用了很多(大约 1000 次。)目前我只是做一个.filter { } 但我认为这可能是一个瓶颈,因为它会遍历整个数组1000 次,而不是在找到第一个这样的日历时爆发。

是否有类似于内置排序功能的优化内置搜索(即,对非常小的数组使用不同的方法,然后是中型或更大的数组)?

基本上,我正在寻找内置排序/排序函数的对应项。拥有这样的东西会很有意义,因为您经常对数组进行排序,然后在其中找到特定的元素。

func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) {
    // make array of words from text
    let words = text.characters.split{$0 == " "}.map(String.init)
    // BOTTLENECK? Check if I have a calendar that is equal to first word of text
    let found = calendars.filter { $0.title.lowercaseString == words.head?.lowercaseString }
    return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found.first)
}

【问题讨论】:

  • 题名与题体有什么关系?
  • 抱歉,已更正。
  • 如果它已经排序,你可以使用二分搜索。
  • @EvanTrimboli 是否有类似于内置排序功能的优化二分搜索(即,对非常小的数组使用不同的方法,然后是中型或更大的数组)?
  • 您是否每次都使用同一组日历调用此方法?如果是这样,您可以构建一个地图,以便查找时间为 O(1)。

标签: arrays swift search optimization


【解决方案1】:

我认为你可以使用 'indexOf' 而不是 'filter' 来解决这个问题:

func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) {
    let words = text.characters.split{$0 == " "}.map(String.init)
    var found: EKCalendar?
    if let index = calendars.indexOf ({ $0.title.lowercaseString == words.head?.lowercaseString }) {
        found = calendars[index]
    }
    return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found) 
}

【讨论】:

  • 但是,这是否考虑到数组已经排序?因为搜索已排序的数组比在未排序的数组中查找索引要快得多。
  • 应该比用filter好。在这一点上,我会做一个小测试来测量两者的运行时间,看看它是否足够好。
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2021-08-04
  • 2017-04-10
  • 2014-07-20
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多