- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从嵌套数组中提取所有可能的非重叠组以生成最少数量的组
{
0: 4, 5, 6
1: 4, 5
2: 3, 4 ,9
3: 8, 9
4: 8,10,11
5: 8,10,11
}
从 0 到 5,这是最好的结果:
1 是更好的组,因为它只有两组。
我知道如何在多个循环中执行此操作,但有什么方法可以一次完成此操作吗?感觉可能是寻路问题,但不确定如何将其转化为寻路问题。
解决方案
我只用了 19 个周期就根据下面 libik 的答案(使用 JS)设计了一个方法!
function bestPath(){
var array = [[4,5,6],[4,5],[3,4,9],[8,9],[8,10,11],[8,10,11]],
arrayOfIndexes = (function (){
var arr = [];
for (var k=0; k < array.length; k++){
arr.push({
index: array[k].length-1,
last_split: 0
})
}
//dummy index, needed for jumping back
arr.push({index:0, last_split:0});
return arr;
})();
// This function clones the current working path
// up to a specific index (which we then use to
// rebuild upon by taking another route)
var cloneTill = function(array, till){
var new_arr = [];
for (var l=0; l < till; l++)
new_arr.push( array[l] );
return new_arr;
};
var numset = 0, // running counter of num. sets in working path
bestset = 99999;
var path_list = [], // array of all paths
best_path = null, //
temppath = []; // current working path
var row = 0,
min_stretch_len = 2; // minimum length heuristic
while (true){
var color_index = arrayOfIndexes[row];
console.log("path="+temppath);
var jumpBack = false;
if (row === 0){
if (color_index.index < 0) break; //No more paths to explore after jumping back.
numset = 0;
}
if (row === array.length){
if (numset < bestset){
bestset = numset;
best_path = temppath;
}
path_list.push ( temppath );
jumpBack = true;
}
if (color_index.index < 0) jumpBack = true;
if (jumpBack){
// console.log( ">>jumprow:"+row+"-->"+color_index.last_split
// +", index to:"+(arrayOfIndexes[color_index.last_split].index - 1)+'\n');
// jump back to last split
row = color_index.last_split;
temppath = cloneTill(temppath, row);
arrayOfIndexes[row].index--;
continue;
}
//We have an unexplored color
var color = array[row][color_index.index];
// console.log(" trying color='"+color+"'");
//Perform lookahead
var stretch = row;
while ( stretch < array.length && array[stretch].indexOf(color)!== -1){
temppath.push(color);
stretch ++;
}
stretch -= row;
// Unsuccessful
if (stretch < min_stretch_len){
// console.log(" failed (too short)");
while(stretch --> 0) temppath.pop(); // clear changes
arrayOfIndexes[row].index--; // next attempt at this row will try a different index
continue;
}
// Successfully found a new color. Splitting
// console.log(" worked, arrayOfIndexes["+(row+stretch)+"].last_split = "+row);
arrayOfIndexes[row+stretch].last_split = row; // this row is where we split
row += stretch;
numset ++;
}
console.log("sols", path_list);
console.log("best path=", best_path);
}
最佳答案
我认为在 O(n) 时间内是不可能的(见评论)。
但是,您可以通过回溯解决此问题、记住最佳解决方案并“剪切”您知道无法比找到的最佳解决方案更好的解决方案来节省一些时间。
这是带切割的回溯解决方案
import java.util.LinkedList;
public class JavaApplication12 {
public static void main(String[] args) {
int[][] array = {{4, 5, 6}, {4, 5}, {3, 4, 9}, {8, 9}, {8, 10, 11}, {8, 10, 11}};
int[] arrayOfIndexes = new int[array.length];
LinkedList<Integer> solution = new LinkedList<>();
boolean end = false;
int valueOfSolution = 1;
int bestValueOfSolution = Integer.MAX_VALUE;
LinkedList<Integer> bestSolution = new LinkedList<>();
int row = 1;
while (end == false) {
if (row == array.length) {
if (bestValueOfSolution > valueOfSolution) {
bestValueOfSolution = valueOfSolution;
bestSolution = (LinkedList<Integer>) solution.clone();
}
row++;
} else {
if (row > array.length) {
row = array.length - 1;
}
if (arrayOfIndexes[0] == array[0].length) {
end = true;
} else if (array[row].length == arrayOfIndexes[row] || solution.size() > row || valueOfSolution >= bestValueOfSolution ) {
if (valueOfSolution >= bestValueOfSolution && !(array[row].length == arrayOfIndexes[row] || solution.size() > row)){
System.out.println("Cutting");
}
boolean decreaseRow = true;
if (solution.size() > row) {
decreaseRow = false;
}
int lastNumber = solution.removeLast();
if (solution.isEmpty() || solution.getLast().equals(lastNumber) == false) {
valueOfSolution--;
}
if (decreaseRow) {
arrayOfIndexes[row] = -0;
row--;
}
} else {
if (!solution.isEmpty() && array[row][arrayOfIndexes[row]] != solution.getLast()) {
valueOfSolution++;
}
if (solution.isEmpty()){
valueOfSolution = 1;
}
solution.add(array[row][arrayOfIndexes[row]]);
arrayOfIndexes[row]++;
row++;
}
}
}
System.out.println("Best solution is: " + bestSolution);
System.out.println("It has value of: " + bestValueOfSolution);
}
}
这个例子的输出是
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Cutting
Best solution is: [4, 4, 4, 8, 8, 8]
It has value of: 2
我添加了一个“numberOfSteps”变量来计算 whyle 循环被调用的次数。
通过切割我得到了
Number of steps:62
没有切割!!
Number of steps:1314
切割由条件 valueOfSolution >= bestValueOfSolution
提供。我们正在寻找最小的数字,对吗?因此,当我们通过添加每一行的数字来构建解决方案时,如果我们已经有了相同或更高的分数,无论我们添加什么数字,我们都不能做得更好,所以我们可以跳过这个。
如果您不知道回溯是什么,这是一个很好的 gif 动图,展示了数独是如何完成的:http://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Sudoku_solved_by_bactracking。 gif/220px-Sudoku_solved_by_bactracking.gif
它只是尝试添加数字,当它无法继续时(因为添加任何数字都会违反数独规则)它会返回并尝试另一个数字。
关于arrays - 所有非重叠组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944338/
在 Windows 世界中,什么是正确的名称。具有导出函数的老式 C++ DLL?不是 COM DLL,也不是 .NET DLL。我们以前通过调用 LoadLibrary() 和 GetProcAdd
目前我正在使用javaEE7,我有一个场景如下。在我的 JSF Web 应用程序中,我有一个事件监听器(不是 JSF 事件),当事件调用时,它会执行某些操作,然后将这些信息更新到我的 Web 应用程序
这不是 AJAX 请求/响应回调问题... 我正在使用 Dojo 1.5 构建网格。我正在尝试 dojo.connect具有功能的扩展/收缩按钮。我的问题是 grid.startup()在创建实际 D
非 Webkit Opera 是 very specific在某些功能中,因此通常通过 JavaScript 检测到 the following way . 但是,Opera Next 几乎是 Goo
我已查看以下链接中给出的所有日志,但未能找到 IP 地址: https://developer.couchbase.com/documentation/server/3.x/admin/Misc/Tr
我有一个命令行程序,它根据一组源文件生成一个我想在我的 Android gradle 构建 (A) 中使用的 jar 文件。这个命令行程序只是将一个 jar 文件存储在磁盘上的一个目录中。 我如何创建
下面的 htaccess 命令将所有非 www 转移到 http www RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^
我正在使用自定义链接器脚本将内核镜像分为两部分。第一个是普通代码和数据,第二个是初始化代码和不再需要时将被丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,因此如果 fork() 仍然存在(
这个问题在这里已经有了答案: Several unary operators in C and C++ (3 个答案) What is the "-->" operator in C++? (29
假设我有一个类设置如下: class A { public: virtual void foo() { printf("default implementation\n"); } }; c
#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) {
近期,百度搜索引擎变化无常,很多企业站、行业站、门户站、论坛等站点遭到了降权,特别是比比贴分类信息网直接遭到了拔毛,这对于广大站长来说是一种打击,也是各个企业、行业的打击。 至今,很多网站已经恢复
我现在正在使用 IBM TPM v1332 + IBM TSS v1470 并尝试将一些基本关键字/密码存储到 TPM 上的非 volatile 内存中。我找到了两种方法。一种是创建一个密封对象并使用
我的 PHP 脚本中有一个正则表达式,如下所示: /(\b$term|$term\b)(?!([^)/iu 这与 $term 中包含的单词匹配,只要前后有单词边界并且它不在 HTML 标记内即可。 但
我想显示用户名称地址(请参阅 www.ipchicken.com ),但我唯一能找到的是 IP 地址。我尝试了反向查找,但也没有用: IPAddress ip = IPAddress.Parse(th
只有 UI 线程能够显示到屏幕上,还是其他线程也可以这样做? 最佳答案 不,您只能直接从 UI 线程访问 UI,但您可以编码来自其他线程的结果,例如使用 Control.Invoke 或 contro
我正在使用现代 Excel 滚动条(不是旧的 ActiveX 类型,即开发人员 > 插入 > 表单控件 > 滚动条)并且想检测它的值何时更改。我找不到有关此类对象的更改事件的任何信息。您可以在单击时分
当我使用这段代码时 IE 6 确实正确使用了指定的样式表,但所有其他浏览器在应该使用基本上声明的样式表时会忽略这两种样式表,如果您不是 IE,请使用此样式表。 有什么想法吗? 最佳答案 n
我想指定 2 mssql 表之间的关系。 付款类别和付款。 paymentcategory.id 加入 payout.category 列。 在 payout.json 模型中 我指定为外键:id,
我正在尝试制作非 volatile UDF,但似乎不可能。因此,这是我非常简单的test-UDF: Option Explicit Dim i As Integer Sub Main() i = 0
我是一名优秀的程序员,十分优秀!