小编Bab*_*ger的帖子

减少程序的时间复杂度(用Java)?

这个问题相当长.这可能需要很长时间,所以如果你没有我理解的时间.

首先让我解释一下我想要实现的目标:我和一些朋友玩这个数学游戏,我们从一组可能的数字中得到6个随机数:1到10,25,50,75和100. 6个数字被选中其中不允许重复.然后将在[100,999]的范围内选择目标号码.使用上述6个数字,我们只能使用基本操作(加法,减法,乘法和除法)来达到目标​​.只允许整数,并且不需要所有6个整数来达到解决方案.

一个例子:我们从数字4,8,6,9,25,100开始,需要找到328.可能的解决方案是:((4 x 100) - (9 x 8))= 400 - 72 = 328.这个,我只使用了6个初始数字中的4个而没有使用过两次.这是一个有效的解决方案.

我们并不总能找到自己的解决方案,这就是为什么我认为一个程序会很有用.我编写了一个程序(用Java编写),它已经过几次测试,并且已经有效了.它并不总是提供所有可能的解决方案,但它在自己的限制范围内工作.现在我已经尝试扩展它,所以所有的解决方案都会显示出来.

关于主要问题:我尝试执行的程序运行时间非常长.就像在,我会让它运行15分钟,它看起来不像是在任何接近完成.所以我想到了它,选项确实是无穷无尽的.我从6个数字开始,我将第一个与其他5个进行比较,然后将第二个与其他5个进行比较,依此类推,直到我完成了6次(每次比较我与每个运算符进行比较,再次进行4次).在最初的6个数字的单个状态中,我现在有5次6次4 = 120个状态(每个5个数字).所有这些都必须经历相同的仪式,所以难怪它花了这么长时间.

该程序实际上太大了,无法在此列出,因此我会将其上传给感兴趣的人:http: //www.speedyshare.com/ksT43/MathGame3.jar (点击下载旁边的MathGame3.jar标题)

以下是发生的事情的一般概述:

-6 integers + goal number are initialized
-I use the class StateNumbers that are acting as game states
  -> in this class the remaining numbers (initially the 6 starting numbers)
     are kept as well as the evaluated expressions, for printing purposes
Run Code Online (Sandbox Code Playgroud)

此方法是主要操作发生的位置:

StateNumbers stateInProcess = getStates().remove(0);
ArrayList<Integer> remainingNumbers = stateInProcess.getRemainingNumbers();
for(int j = 0; j …
Run Code Online (Sandbox Code Playgroud)

java complexity-theory

5
推荐指数
1
解决办法
5976
查看次数

如何在ECLiPSe(CLP)中将向量转换为数组?(或Prolog)

我必须以包含9个向量(每个长度为9)的向量的格式解决数独谜题.看到矢量是Prolog中的链接列表,我认为如果我首先以2D数组格式转换谜题,搜索会更快.

示例拼图:

puzzle(P) :- P = 
[[_,_,8,7,_,_,_,_,6],
[4,_,_,_,_,9,_,_,_],
[_,_,_,5,4,6,9,_,_],

[_,_,_,_,_,3,_,5,_],
[_,_,3,_,_,7,6,_,_],
[_,_,_,_,_,_,_,8,9],

[_,7,_,4,_,2,_,_,5],
[8,_,_,9,_,5,_,2,3],
[2,_,9,3,_,8,7,6,_]].
Run Code Online (Sandbox Code Playgroud)

我正在使用ECLiPSe CLP来实现解算器.到目前为止,我提出的最好的方法是写一个这样的域:

domain(P):-
  dim(P,[9,9]),
  P[1..9,1..9] :: 1..9.
Run Code Online (Sandbox Code Playgroud)

和拼图的转换器(参数P是给定的拼图,Sudoku是具有2D阵列的新定义的网格).但是我无法将给定初始拼图中的值链接到我的2D数组.

convertVectorsToArray(Sudoku,P):-
  ( for(I,1,9),
      param(Sudoku,P)
    do
      ( for(J,1,9),
          param(Sudoku,P,I)
        do
          Sudoku[I,J] is P[I,J]
      )
  ).
Run Code Online (Sandbox Code Playgroud)

在此之前,我尝试使用array_list(http://eclipseclp.org/doc/bips/kernel/termmanip/array_list-2.html),但我一直遇到类型错误.我以前怎么做过:

convertVectorsToArray(Sudoku,P):-
  ( for(I,1,9),
      param(Sudoku,P)
    do
      ( for(J,1,9),
          param(Sudoku,P,I)
        do
          A is Sudoku[I],
          array_list(A,P[I])
      )
  ).
Run Code Online (Sandbox Code Playgroud)

当我的Sudoku最终输出以下格式的示例拼图P时:

Sudoku = []([](_Var1, _Var2, 8, 7, ..., 6), [](4, ...), ...)
Run Code Online (Sandbox Code Playgroud)

那我会很开心

更新

我再次尝试使用array_list; 它几乎与以下代码一起使用:

convertVectorsToArray(Sudoku,P):-
  ( for(I,1,9),
      param(Sudoku,P)
    do
      X is Sudoku[I],
      Y …
Run Code Online (Sandbox Code Playgroud)

arrays prolog eclipse-clp

5
推荐指数
1
解决办法
411
查看次数

使用 Electron 截取桌面截图

我正在使用 Electron 创建一个 Windows 应用程序,该应用程序创建一个全屏透明覆盖窗口。该覆盖层的目的是:

  1. 截取整个屏幕的屏幕截图(不是透明的覆盖层本身,而是屏幕“下方”),
  2. 通过将图像作为字节流发送到我的 python 服务器来处理该图像,并且
  3. 在覆盖层上画一些东西

我陷入了第一步,即屏幕截图捕获过程。

我尝试了选项 1,即使用capturePage()

this.electronService.remote.getCurrentWindow().webContents.capturePage()
    .then((img: Electron.NativeImage) => { ... }
Run Code Online (Sandbox Code Playgroud)

但这仅捕获我的覆盖窗口(而不是桌面屏幕)。这将是一张对我来说毫无用处的空白图像。

选项 2是使用desktopCapturer

this.electronService.remote.desktopCapturer.getSources({types: ['screen']}).then(sources => {
    for (const source of sources) {
        if (source.name === 'Screen 1') {
            try {
                const mediaDevices = navigator.mediaDevices as any;
                mediaDevices.getUserMedia({
                    audio: false,
                    video: { // this specification is only available for Chrome -> Electron runs on Chromium browser
                        mandatory: {
                            chromeMediaSource: 'desktop',
                            chromeMediaSourceId: source.id,
                            minWidth: …
Run Code Online (Sandbox Code Playgroud)

javascript electron angular

5
推荐指数
2
解决办法
1万
查看次数

差异确定并结束 [Erlang]

在 Erlang 中以 end 和 ok 结束函数有什么区别?我一直在试图理解以下代码中的含义:

-module(esOne).
-export([start/1, func/1]).

start(Par) ->
    io:format("Client: I am ~p, spawned by the server: ~p~n",[self(),Par]),
    spawn(esOne, func, [self()]),
    Par ! {onPid, self()},
    serverEsOne ! {onName, self()},
    receiveMessage(),
    ok.

receiveMessage() ->
    receive
        {reply, N} ->
            io:format("Client: I received a message: ~p~n",[N])
    after
        5000->
            io:format("Client: I received no message, i quit~n",[])
    end.

func(Parent)->
    io:format("Child: I am ~p, spawned from ~p~n",[self(),Parent]).
Run Code Online (Sandbox Code Playgroud)

此代码与充当服务器的另一个 .erl 文件结合使用。我只能通过分析给定的服务器文件并复制它的行为来编写这个。首先,我认为 ok 用于结束每个函数,但事实并非如此,因为我不能用 ok 结束 receiveMessage()。然后我想我可以用 end 结束每个函数,但是如果我用 end 替换 ok,start(Par) 会出错。不仅如此,在服务器文件中,我看到 ok 和 …

erlang

4
推荐指数
1
解决办法
400
查看次数

测量执行时间ECLiPSe CLP(或Prolog)

如何在ECLiPSe CLP中测量方法的执行时间?目前,我有这个:

measure_traditional(Difficulty,Selection,Choice):-
  statistics(runtime, _),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  time(solve_traditional(Difficulty,Selection,Choice,_)),
  statistics(runtime,[_|T]), % T 
  write(T).
Run Code Online (Sandbox Code Playgroud)

我需要编写执行方法solve_traditional(...)并将其写入文本文件所花费的时间.但是,它不够精确.有时,给定方法的时间将打印0.015或0.016秒,但通常打印0.0秒.

确定方法完成得太快,我决定使用统计信息(运行时,...)来测量两次运行时调用之间的时间.然后,我可以测量完成20次方法调用所需的时间,并将测量的时间T除以20.

唯一的问题是,20次调用T等于0,16,32或48毫秒.显然,它分别测量每个方法调用的时间,并找到执行时间的总和(通常只有0.0秒).这超过了测量N个方法调用的运行时间并将时间T除以N的全部目的.

简而言之:我用于执行时间测量的当前方法是不合适的.有没有办法使它更精确(例如9位小数)?

performance prolog performance-testing eclipse-clp

3
推荐指数
1
解决办法
676
查看次数

旁观者角度测试 - 在 ngOnInit 之前传递输入

我正在使用Spectator编写我的 Angular 8 测试并使用Jest来运行它们。根据自述文件,我可以setInput()用来将我的值分配给有效的字段名称。问题是在创建组件后正在验证输入,但在此之前我需要它,因为我在我的ngOnInit方法中使用它进行初始化:

// item.component.ts

@Input() items: Items[] = [];

ngOnInit(): void {
    // do something with this.items
    // read query param 'page' and use it for something
}
Run Code Online (Sandbox Code Playgroud)

// item.component.spec.ts

let spectator: SpectatorRouting<ItemComponent>;
const createComponent = createRoutingFactory({
    component: ItemComponent,
    queryParams: {page: 1}
});

beforeEach(() => spectator = createComponent());

it('test items', () => {
    spectator.setRouteQueryParam('page', '2');
    spectator.setInput("items", myItemsList); 
});
Run Code Online (Sandbox Code Playgroud)

旁观者将正确设置 queryParampage和 Input items,但只有在组件已经创建之后。在组件创建期间ngOnInit将使用 …

jestjs angular angular-spectator

3
推荐指数
1
解决办法
2142
查看次数

移动后,唯一指针仍然保持对象

我正在阅读一些有关智能指针如何在C++中工作的教程,但我仍然坚持我尝试的第一个:唯一指针.我正在遵循维基百科,cppreferencecplusplus的指导原则.我已经看过这个答案了.如果我理解正确的话,唯一的指针应该是对某个存储单元/块具有所有权的唯一指针.这意味着只有唯一指针(应该)指向该单元格而没有其他指针.从维基百科,他们使用以下代码作为示例:

std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2 = p1; //Compile error.
std::unique_ptr<int> p3 = std::move(p1); //Transfers ownership. p3 now owns the memory and p1 is rendered invalid.

p3.reset(); //Deletes the memory.
p1.reset(); //Does nothing.
Run Code Online (Sandbox Code Playgroud)

直到第二行,当我测试它时,这对我来说很好.但是,在第一个唯一指针移动到第二个唯一指针后,我发现两个指针都可以访问同一个对象.我认为整个想法是让第一个指针变得毫无用处可以这么说?我期望一个空指针或一些未确定的结果.我运行的代码:

class Figure {
public:
    Figure() {}

    void three() {
        cout << "three" << endl;
    }

};

class SubFig : public Figure {
public:
    void printA() {
        cout << "printed a" …
Run Code Online (Sandbox Code Playgroud)

c++ pointers

2
推荐指数
2
解决办法
833
查看次数

Java swing JOptionPane:结合showInputDialog和showOptionDialog?

我在这里关注API:

http://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html#showOptionDialog%28java.awt.Component,%20java.lang.Object,%20java.lang.String,%20int ,%20int,%20javax.swing.Icon,%20java.lang.Object [],%20java.lang.Object%29

我有一个项目列表,我想在提示窗口的ComboBox中显示.来自JOptionPane的showInputDialog方法允许我这样做,但它限制了我两个按钮(确定和取消).我想有更多按钮(我可以定义更多按钮,但我不知道如何使用showInputDialog将其添加到此窗口).

我可以使用showOptionDialog创建一个选项数组(包含我需要的所有按钮),但是提示窗口无法显示我的项目列表.通常接受项目数组的参数(在showInputDialog中)现在需要一个按钮数组.

Object[] selectionValues replaced by Object[] options
Run Code Online (Sandbox Code Playgroud)

有没有办法结合他们的功能?

我可以在技术上创建一个新的GUI来实现这一点,但如果已经有一个现有的实现,我可能会做很多不必要的工作.此外,在能够对原始帧执行任何操作之前,用户在新提示窗口上完成任务非常重要.

所以最后,这应该发生:

  1. 用户点击某些内容并出现提示窗口.
  2. 提示窗口显示组合框(Dropbox?)项目列表.
  3. 用户选择其中一个项目并可以选择按ok,取消,跳过,...(我已定义的任意数量的按钮)3a.在单击新提示窗口上的某个按钮之前,用户无法对原始GUI执行任何操作.
  4. 当单击其中一个按钮时,它执行它的功能,用户可以继续主GUI.

java user-interface swing joptionpane

1
推荐指数
1
解决办法
5273
查看次数