小编Dan*_*ahr的帖子

在完美的二叉树中获取顶点的父级

我有一个完美的二叉树,它列举了后序方式.这种树的一个例​​子是

                         15
                 7               14
             3       6       10      13
           1   2   4   5    8  9   11  12
Run Code Online (Sandbox Code Playgroud)

树的大小是我所知道的.我正在寻找一个公式或一个简单的算法,它将一个数字作为输入(我感兴趣的顶点的ID)并返回一个数字 - 父亲的ID.从顶部遍历树并获得结果非常容易O(log n).有更快的解决方案吗?我最感兴趣的是叶子,所以如果有特殊情况的解决方案,也可以带上它.

algorithm tree binary-tree data-structures postorder

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

三胞胎的最佳合并

我正在尝试针对以下问题提出算法:

我有一个整数三元组的集合 - 让我们称这些整数为A,B,C.存储在里面的值可能很大,所以通常不可能创建一个大小为A,B或C的数组.目标是最小化集合的大小.为此,我们提供了一个简单的规则,允许我们合并三元组:

  • 对于两个三元组(A,B,C)和(A',B',C'),如果B == B'和C = C,则删除原始三元组并放置三元组(A | A',B,C) ',其中| 是按位OR.B和C也有类似的规则.

换句话说,如果两个三元组的两个值相等,则删除这两个三元组,按位或删除第三个值,并将结果放入集合中.

贪婪的方法在类似的情况下通常会产生误导,所以这是针对这个问题,但我找不到一个简单的反例,它会导致正确的解决方案.对于包含正确解为14的250项的列表,通过贪婪合并计算的平均大小约为30(从20到70不等).随着列表大小的增加,次优开销变得更大.

我也尝试过设置位计数,但我发现没有有意义的结果.显而易见的事实是,如果记录是唯一的(可以安全地假设),则设置的位数总是增加.

这是愚蠢的贪婪实现(这只是一个概念性的事情,请不要考虑代码风格):

public class Record {
    long A;
    long B;
    long C;

    public static void main(String[] args) {
        List<Record> data = new ArrayList<>();
        // Fill it with some data

        boolean found;

        do {
            found = false;
            outer:
            for (int i = 0; i < data.size(); ++i) {
                for (int j = i+1; j < data.size(); ++j) {
                    try {
                        Record r = merge(data.get(i), data.get(j));
                        found …
Run Code Online (Sandbox Code Playgroud)

java algorithm optimization

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

如何使用linux限制行中存在的字符串长度

我有以下形式的数据:

num1    This is a string
num2    This is another string
Run Code Online (Sandbox Code Playgroud)

我想限制在第一个标签之后的所有字符串的长度.这样长度(字符串)<4.因此,我得到的输出是:

num1    This is a string
num2    This is another 
Run Code Online (Sandbox Code Playgroud)

我可以使用python来做到这一点.但我试图找到一个Linux等价物,以实现相同.

linux bash ubuntu

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

算法:字母和信封配对

免责声明:这不是任何一种功课,在我浏览所有圣诞卡时,我才想到这个问题

问题如下:我们有M个信封和N个字母,每个字母被描述为一对正整数.信封和字母都是矩形的,显然可以旋转.如果两个尺寸都小于或等于信封的尺寸,则字母会放入信封中.目标是找到最大的信封 - 字母匹配.

该问题很容易转换为最大的二分匹配问题,其中O(sqrt(M+N) * MN)存在一个运行的算法(Hopcroft-Karp,转换平常运行O(MN)).我试图提出一个贪婪的算法或动态的方法,但我没有找到任何.

你知道更快的解决方案吗?

algorithm matching bipartite

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

Java"工作流程"设计

我想问一下设计"工作流程合并".我有几个彼此不太相似的工作流程.但是,有时候我想要将它们组合起来进行修改.让我给你举个例子 :

工作流程1 - 旅行

A1(打包) - > A2(离开房子) - > A3(赶上公交车) - > A4 ......

工作流程2 - 每日植物浇水

B1(打开水) - > B2(离开房子) - > B3(给植物浇水) - > B4(进入房子) - > B5(关掉水)

星期天,我想去旅行,我也需要给植物浇水.所以我想创建像A1 - > B1到B5 - > A2 ......的东西.我也想有可能告诉我的朋友完成浇水,这将是A1 - > B1到B2 - > C1(将任务交给朋友) - > A3 ...正如你所看到的,流程很简单 - 它没有叉子和连接,我不需要这样的功能.我所需要的只是创建一个线性的命令列表,可以轻松地将它们合并在一起.所有代码片段目前都是Java方法(我想让它们像原子流一样).

我的方法的主要目标应该是避免一遍又一遍地输入相同的代码.流程可能有数百个步骤.我想做出这样的声明执行流程的,但不是运行A2和A3,B2执行对B6和继续进行.

我有两个主要问题:

  • 是否有任何框架已经支持这个?如果有,是不是太复杂了我的目的?
  • 如果没有,那么实施此类事情的最佳方式是什么?

注意:请说明我的问题有哪些不清楚?

java workflow

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

Java继承的返回类型

我有一个关于Java继承方法中的返回类型的问题。我有一个课和一个继承的课。在继承的类中,有一个特定的方法。它还从父类继承了一个返回其自身实例的方法。

我想要这样的类层次结构:

public class Foo {
    public Foo bar()
    {
        return this;
    }
}

public class FooInherited extends Foo {
    public Whatever baz()
    {
        return new Whatever();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以从其实例调用继承的方法,然后再调用特定的方法而不覆盖该方法以返回继承的类或显式转换类。

现在我想要一个这样的代码片段:

FooInherited foo = new FooInherited();
Whatever w = foo.bar().baz();
Run Code Online (Sandbox Code Playgroud)

我对此感到困难,但是我不确定在这种情况下Java是否为程序员提供了节省时间的机制。

java inheritance return-type

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

Python主线程中断

谁能解释一下interrupt_main()方法在Python中是如何工作的?

我有这段Python代码:

import time, thread

def f():
    time.sleep(5)
    thread.interrupt_main()

def g():
    thread.start_new_thread(f, ())
    time.sleep(10)
print time.time()
try:
    g()
except KeyboardInterrupt:
    print time.time()
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,它给我以下输出:

1380542215.5
# ... 10 seconds break...
1380542225.51
Run Code Online (Sandbox Code Playgroud)

但是,如果我手动中断程序(CTRL-C),线程会被正确中断:

1380542357.58
^C1380542361.49
Run Code Online (Sandbox Code Playgroud)

为什么线程中断仅在第一个示例中的10秒(而不是5)之后发生?

我在Python邮件列表中找到了一个古老的线程,但它几乎没有解释.

python multithreading keyboardinterrupt

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

Java Generics - 从泛型类型调用特定方法

我尝试深入研究Java Generics,我遇到了以下示例代码描述的问题.

public static void test(Object o) {
    System.out.println("Hello Object!");
}

public static void test(Integer i) {
    System.out.println("Hello Integer!");
}

public static <T> void test(Collection<T> col) {
    for (T item : col) {
        System.out.println(item.getClass().getSimpleName());
        test(item);
    }
}

public static void main (String[] args) throws java.lang.Exception
{
    Collection<Integer> ints = new ArrayList<>();
    ints.add(1);
    test(ints);
}
Run Code Online (Sandbox Code Playgroud)

样本的输出是

Integer
Hello Object!
Run Code Online (Sandbox Code Playgroud)

所有类型在编译时都是明显的.据我所知,Java只保存每个方法的一个编译副本(与C++不同),并且因为没有给出关于参数T的其他约束,所以它被迫调用通用的Object实现.

我的问题是 - 有没有办法为整数调用"Hello Integer"方法Collection<Integer>而不使用运行时类型检查而不重载测试方法?

java generics

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

Django - 什么方法可以立即获取外键对象?

我对Django中的外键行为有疑问.

我在模型中定义了一个树层次结构,其中父子关系在子模型中表示为外键.现在,从叶级开始,我想检索父级,父级的父级等作为我定义的对象.

这可以通过简单地调用Leaf.objects.all()并通常从Python代码访问对象来实现.

但是这里遇到了麻烦.对于每个这样的调用,Django对适当的外部ID进行SELECT查询.这显然非常缓慢且效率低下.我想告诉Django类似"嘿,只需一次取出包括外键在内的所有数据,只需在数据库端进行连接和所有操作".这有点可行吗?

python database django foreign-keys

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