arrays - 如何提高代码的速度?

标签 arrays swift

如果 arrayOfA 中的元素数量约为 1000,而 arrayOfB 中的元素数量约为 100,000(运行时间约为几分钟),则以下代码存在速度问题。如何提高速度?

let arrayOfA = [(String, String)]() //second string in tuple is about 30 characters 
let arrayOfB = [String]() //string is about 200 characters 
var arrayOfC = [(String, Int)]()

for i in 0..<arrayOfA.count
{
     var amount = Int()
     let name = arrayOfA[i].0 + "  " + arrayOfA[i].1

     for j in 0..<arrayOfB.count
     {
         if arrayOfB[j].range(of: arrayOfA[i].1) != nil
         {
             amount += 1
         } 
     }
     if amount > 0
     {
         arrayOfC += [(name, amount)]
     }
}

更新 同时,我制作了另一个代码,速度快了大约 4 倍。这个想法是为了避免函数 .range(of: string) 不必要的重复步骤。 .因此,第一步是加入间隔为 "_" 的读取。然后,我可以搜索找到所有 Range<String.Index>对于 stringOfarrayOfB 中的字符串 A通过使用扩展方法 searchForStringInString (可以在Range<String.Index>中找到stringIn的所有stringOut)。

let stringOfarrayOfB = arrayOfB.joined(separator: "_")

for i in 0..<arrayOfA.count
{
     var amount = Int()

     let arrayOfRanges = stringOfarrayOfB.searchForStringInString(stringOut: stringOfarrayOfB, stringIn: arrayOfA[i].1)

     amount = arrayOfRanges.count

     if amount > 0
     {
         let name = arrayOfA[i].0 + "  " + arrayOfA[i].1
         arrayOfC += [(name, amount)]
     }
}

最佳答案

这是根据建议的注释更改后的代码。

let arrayOfA = [(String, String)]() //second string in tuple is about 30 characters 
let arrayOfB = [String]() //string is about 200 characters 
var arrayOfC = [(String, Int)]()

for i in 0..<arrayOfA.count
{
     var amount = Int()

     for (index, stringB) in arrayOfB.enumerate().reverse()
     {
         if stringB.range(of: arrayOfA[i].1) != nil
         {
             amount += 1
             arrayOfB.removeAtIndex(index)
         } 
     }
     if amount > 0
     {
         let name = arrayOfA[i].0 + "  " + arrayOfA[i].1
         arrayOfC += [(name, amount)]
     }
}

更新

无需反转数组即可实现相同的功能

let arrayOfA = [(String, String)]() //second string in tuple is about 30 characters 
    let arrayOfB = [String]() //string is about 200 characters 
    var arrayOfC = [(String, Int)]()

for i in 0..<arrayOfA.count
{
     var amount = Int()
     var indexesToDelete = []
     for (index, stringB) in arrayOfB.enumerate()
     {
         if stringB.range(of: arrayOfA[i].1) != nil
         {
             amount += 1
             indexesToDelete.append(index)
         } 
     }

     for (index, indexToDelete) in indexesToDelete {
         arrayOfB.removeAtIndex(indexToDelete - index)
     }

     if amount > 0
     {
         let name = arrayOfA[i].0 + "  " + arrayOfA[i].1
         arrayOfC += [(name, amount)]
     }
}

关于arrays - 如何提高代码的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015450/

相关文章:

ios - 快照 View (屏幕更新后 : true) returns an empty view

swift - nil 文字与 Swift 中为 nil 的变量的可选绑定(bind)

swift - 具有动态宽度和高度的选项卡 View Controller

ios - UICollectionView.reloadData() 更改单元格顺序 | iOS swift

swift - ReactiveCocoa 简单属性与 swift 绑定(bind)

c# - 使用 PHP SOAP 服务返回一个数组

javascript - 获取数组 JavaScript 中出现次数最多的元素

php - 如何显示这个数组呢?

java - 访问结构体数组

python - Numpy 始终将邻居获取为 3x3 矩阵