algorithm - 修复了使用分区号和流计算的 Scala 代码,但速度太慢
问题描述
我想谈谈如何进行。
1. Scala 的错误使用。我应该尝试更多地改进代码。
2.算法效率差。我应该想一个有效的算法。
目标:可以从1000多个Partition Numbers集合中快速计算出最大数量。
分区号:
例如,
5 -> (5), (1, 4), (2, 3), (1, 1, 3), (1, 2, 2), (1, 1, 1, 2), (1, 1, 1, 1, 1)
我问“我想使用 Vector 将分区函数从 Python 转换为 Scala”,昨天我被教导使用 Stream。
我固定了代码,我可以使用 10、50 等等。但是使用大数字(例如,100、1,000 或 10,000)并不能计算最大数量。
它从Stream.last
到计算Stream.head
。
据我了解,Stream 类型只能在头部添加一个元素,因此数字的顺序与第一个代码相反。
代码
import scala.math.floor
class PartitionNumbers(startNum: Int, point: Int) {
var maxNum = 0
var tmpNum = 0
private def appendOnes(n: Int, s: Stream[Int] = Stream.empty[Int]): Stream[Int] = {
if (n == 0) s
else appendOnes(n - 1, 1 #:: s)
}
private def partition(n: Int, k: Int, tmpStream: Stream[Int] = Stream.empty): Int = {
if (n == 0) tmpNum = calculate(tmpStream)
else if (n == 1 | k == 1) tmpNum = calculate(appendOnes(n))
else {
if (n >= k) partition(n - k, k, k #:: tmpStream)
partition(n, k - 1, tmpStream)
}
if (maxNum < tmpNum) maxNum = tmpNum
maxNum
}
def searchMax(n: Int = point): Int = {
partition(n, n)
}
def calculate(usePointsStream: Stream[Int], num: Int = startNum): Int = {
if (usePointsStream.isEmpty) {
num
} else {
calculate(usePointsStream.init, floor(num * (100 + usePointsStream.last) / 100).toInt)
}
}
}
输出示例
val pn_1 = new PartitionNumbers(100, 10)
println(pn_1.searchMax()) // -> 110
val pn_2 = new PartitionNumbers(1000, 50)
println(pn_2.searchMax()) // -> 1630
val pn_3 = new PartitionNumbers(10000, 100)
println(pn_3.searchMax()) // Can't calculate within 3 minutes using Ryzen 7 2700X.
解决方案
推荐阅读
- c++ - 红帽:使用
编译正常但链接器找不到 __atomic_store_16; 什么图书馆? - php - 我们可以为 OpenSSL ECC 拥有多个公钥和一个私钥吗?
- angularjs - .withButtons() 不是函数
- android - 在android studio中重构移动文件时出现意外的元素类型类
- mysql - 如何连接日期并在日期月份下检索
- javascript - 递增 localStorage 对象名称以存储来自输入的数据
- microservices - 事件溯源和 CQRS 如何帮助解耦微服务?
- python - 如何在 Azure Databricks Notebook 中使用 pysft 模块
- git - 使用 TAG 将 Bitbucket 迁移到 Github 以获取现有迁移的存储库
- ios - 在 UITableViewCell 中更新 UITextView 的属性文本时,UITableView 的滚动不流畅