我有这个练习要做:

设M为正整数,V = v1,.. .,vn假设有序载体where the value of item vi is 5×i.

提出一个O(log(n))算法,该算法返回V中可以 Select 的最大项目数,前提是所选项目的总和小于或等于M(不允许重复 Select 项目).

首先我做了一个天真的解决方案:

  • 我知道数组上的元素之和将始终小于数组上的M/5索引.所以a做了for i=0..i<=M/5并找到了总和.此外,这不是O(log(n)),因为给定一个大M,大于数组上所有元素的总和,它将是O(n).

因此我try 了分而治之,我认为二分法应该是办法.但实际上不是,因为如果我这样做,我将对可以 Select 以得到M的最小元素进行总和,而不是最大元素.我的代码在下面

   def max_items_selected_recursive2(M, V, left, right, max):

    if len(V[left:right]) == 1:
      return max
    

    mid =  math.floor((left+right)/2)
    if  V[mid] >= M:
        return max_items_selected_recursive2(M - V[mid], V, mid + 1, right, max+1)
    else:
        if  M - V[mid] >= 0:
          return max_items_selected_recursive2(M - V[mid], V, left, mid - 1, max+1)
        else: 
          return max_items_selected_recursive2(M, V, left, mid - 1, max)
   

呼叫示例

M = 20
  V = [0, 5, 10, 15, 20]
  max_items_selected_recursive2(M, V, 0, len(V) - 1, 0) +1 # +1 since all have the O element

关于如何在O(log n)上做到这一点有什么 idea 吗?

推荐答案

总和1 + 2 +. + n = n *(n+1)/ 2.

总和5 + 10 +. + 5 n = 5 *(1 + 2 +. + n)= 5 * n *(n+1)/ 2.

因此给定M,我们想要求解n,以便5 * n *然后,将1加到零.

您可以使用二次公式来求O(1)(也是O(log n))解,或者对n进行二分法搜索以求O(log n)解.

Python相关问答推荐

Flask:如何在完整路由代码执行之前返回验证

在Windows上启动新Python项目的正确步骤顺序

LAB中的增强数组

Python中使用时区感知日期时间对象进行时间算术的Incredit

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

Class_weight参数不影响RandomForestClassifier不平衡数据集中的结果

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

我如何根据前一个连续数字改变一串数字?

部分视图的DataFrame

使用Python更新字典中的值

pandas:排序多级列

启动带有参数的Python NTFS会导致文件路径混乱

Polars将相同的自定义函数应用于组中的多个列,

合并与拼接并举

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

如何在Python Pandas中填充外部连接后的列中填充DDL值

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion