【问题标题】:Search optimisation in PythonPython中的搜索优化
【发布时间】:2021-12-15 02:21:12
【问题描述】:
def CountingVallys(PathsTaken):

    #Converts the Strings U and D into 1 and -1 respectively
    Separate_Paths = [i for i in PathsTaken]
    for index, i in enumerate(Separate_Paths):
        if i == "D":
            Separate_Paths[index] = -1
        else:
            Separate_Paths[index] = 1

    Total_travels = [sum(Separate_Paths[0:i+1]) for i in range(len(Separate_Paths))]

    #ValleyDistance shows the indexes where the traveller is below sea level and Valley Depth shows the depth at those
    #Indexes
    ValleyDistance = []
    ValleyDepth = []
    for Distance, Depth in enumerate(Total_travels):
        if Depth < 0:
            ValleyDistance.append(Distance)
            ValleyDepth.append(Depth)


    #Checks the distance between each index to shows if the valley ends (Difference > 1)
    NumberOfValleys = []
    DistanceOfValleys = []
    TempDistance = 1
    for index, Distance in enumerate(ValleyDistance):

        # Check if final value, if so, check if the valley is distance 1 or 2 and append the final total of valleys
        if ValleyDistance[index] == ValleyDistance[-1]:
            if ValleyDistance[index] - ValleyDistance[index - 1] == 1:
                TempDistance = TempDistance + 1
                DistanceOfValleys.append(TempDistance)
                NumberOfValleys.append(1)
            elif ValleyDistance[index] - ValleyDistance[index - 1] > 1:
                DistanceOfValleys.append(TempDistance)
                NumberOfValleys.append(1)

        #For all indexes apart from the final index
        if ValleyDistance[index] - ValleyDistance[index-1] == 1:
            TempDistance = TempDistance + 1
        elif ValleyDistance[index] - ValleyDistance[index-1] > 1:
            DistanceOfValleys.append(TempDistance)
            NumberOfValleys.append(1)
            TempDistance = 1

    NumberOfValleys = sum(NumberOfValleys)

    return NumberOfValleys



if __name__ == "__main__":
    Result = CountingVallys("DDUDUUDUDUDUD")
    print(Result)

狂热的徒步旅行者会仔细记录他们的徒步旅行。远足总是在海平面开始和结束,每一步向上 (U) 或向下 (D) 都代表高度的一个单位变化。我们定义了以下术语:

山谷是低于海平面的一系列连续台阶,从海平面下降开始,到海平面上升结束。

查找并打印走过的山谷数量。

在这个问题中,我因执行时间过长而被标记,我想知道是否可以进行任何明确的优化以使其更快。我相信使用“for-loops”是罪魁祸首,但我不确定执行我的步骤的任何其他方式。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:
    Total_travels = [sum(Separate_Paths[0:i+1]) for i in range(len(Separate_Paths))]
    

    在上面的代码中,你为什么要重复你已经执行的计算? sum(Separate_Paths[0:i+1]) = sum(Separate_Paths[0:i] + Separate_Paths[i+1]

    您可以有效地制作列表 Total_travels。这应该可以解决您的程序执行时间过长的问题。

    >>> a
    [2, 6, 4, 9, 10, 3]
    >>> cumulative_sum = []
    >>> sum_till_now = 0
    >>> for x in a:
    ...     sum_till_now += x
    ...     cumulative_sum.append(sum_till_now)
    ... 
    >>> cumulative_sum
    [2, 8, 12, 21, 31, 34]
    >>> 
    
    

    numpy 有一个内置的cumsum,我认为这对于您的问题来说是多余的。

    【讨论】:

      【解决方案2】:

      这是一个替代解决方案:

      通过使用堆栈,很容易找到山谷。

      1. 对于相同类型(“D”或“U”)的每个新路径,将其推入堆栈
      2. 在推送之前,检查最后一项,如果它们相反,则将其从堆栈中删除 (if(stack[-1]!=path[i]): stack.pop()) 并记住 (last_path=path[i])
      3. 如果堆栈是空的,则表示存在并随着海平面(山谷或山脉)切割。如果最后一条路径是“U”,那么这意味着它是一个山谷,所以我们计算它 (if(len(stack)==0): if(last_path=='U'): valleys+=1)。
      4. 有可能在路径末端与海平面一起切割,因此我们也需要在循环之外处理它 (if(len(stack)==0 and last_path=='U'): valleys+=1)。

      代码如下:

      def countingValleys(steps, path):
          stack=[]
          valleys=0
          last_path=None
          for i in range(len(path)):
              if(len(stack)==0):
                  if(last_path=='U'):
                      valleys+=1
                  stack.append(path[i])
              else:
                  if(stack[-1]!=path[i]):
                      stack.pop()
                      last_path=path[i]
                  else:
                      stack.append(path[i])
          if(len(stack)==0 and  last_path=='U'):
                valleys+=1
      
          return valleys
      
      print(countingValleys(12,"DUDUDUUUUDDDDU"))
      

      【讨论】:

        猜你喜欢
        • 2013-05-20
        • 2012-10-16
        • 1970-01-01
        • 2017-03-30
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        相关资源
        最近更新 更多