如何提高这段代码的时间复杂度?

时间:2015-09-16 16:22:40

标签: ruby

我正在努力缩短时间。如果这可以在O(n ^ 2)中完成,那将是非常棒的。

def printDistance(file)
   line = file.gets

  if line == nil then return end

  sz, sx, sy, ex, ey = line.split(/\s/)
  #counter = 0
  while line = file.gets do
    if line[0...4] == "path"
    else
      x, y, ds, w = line.split(/\s/,4)
      x = x.to_i
      y = y.to_i
      matrix= Array.new
      later = Array.new
      tmp = Array.new
      processing = Array.new
      if matrix[y].class != Array
        matrix[y] = Array.new
      end

      if ds == ""  #this cell has NO way to get to
        matrix[y][x] = nil
      else
        matrix[y][x] = ds
      end
    end
  end
  for y in 0...matrix.length
    processing[y] = Array.new
    tmp[y] = Array.new
    later[y] = Array.new
  end
  printing = Array.new
  counter = 0
  sy = sy.to_i
  sx = sx.to_i
  processing[sy][sx] = matrix[sy][sx]
  matrix[sy][sx] = nil
  puts "#{counter},(#{sx},#{sy})" #first one 
  counter += 1
  loop do
    print "#{counter},"
    counter += 1
    for y in 0...processing.length
      for x in 0...processing[y].length
        if processing[y][x].class != nil 
          tmp[y][x] = processing[y][x]
          dirArr = tmp[y][x].to_s.split(//)
          dirArr.each { |c|
            if c == "u"
              newY = y - 1
              newX = x
            elsif c == "d"
              newY = y + 1
              newX = x
            elsif c == "l"
              newY = y
              newX = x - 1
            else  #c == r
              newY = y
              newX = x + 1
            end
            if matrix[newY][newX] != nil
              tmpStr = "(#{newX},#{newY})"

              printing.unshift(tmpStr)

              later[newY][newX] = matrix[newY][newX]

              matrix[newY][newX] = nil
            end
          }
        end
      end
    end
    printing.sort!
    for i in 0...printing.length
      print printing[i]
      if i < printing.length - 1
        print ","
      end
    end
    printing = []   #resetting
    puts
    for i in 0...later.length
      for j in 0...later[i].length
        if later[i][j] != nil
          processing[i][j] = later[i][j]
        end
      end
    end
    break if NotEmpty(matrix) == false
  end
end

def NotEmpty (a)
  for i in 0...a.length
    for j in 0...a[i].length
      if a[i][j] != nil

        return true
      end
    end
  end
  return false
end

基本上这段代码读入一个文件并将其放在一个代表迷宫的二维数组中,然后根据迷宫的起点,它将执行一个BFS,将所有单元格从最接近的开始到最远,然后打印出一切

这段代码现在是O(n ^ 3)但是我试图把它缩小到O(n ^ 2),无论如何我可以遍历一个二维数组并跟踪x和y值而不使用两个forloops? 任何帮助表示赞赏!!谢谢!

0 个答案:

没有答案