小编ead*_*ead的帖子

找到"好"邻居的算法 - 图着色?

我有一群人,他们每个人都有朋友名单和敌人名单.我想把它们排成一行(桌子上没有圆圈),所以没有敌人,只有朋友彼此相邻.

输入示例:https://gist.github.com/solars/53a132e34688cc5f396c

我想我需要使用图形着色来解决这个问题,但我不确定如何 - 我想我必须省略朋友(或敌人)列表以使其更容易并映射到图表.

有谁知道如何解决这些问题,并告诉我,如果我走在正确的道路上?

代码示例或在线示例也不错,我不介意编程语言,我通常使用Ruby,Java,Python,Javascript

非常感谢你的帮助!

python algorithm graph graph-algorithm

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

将多个非数字插入到std :: unordered_set <double>中

IEEE 754标准的结果之一是std::unordered_set<double>NAN插入非数字元素时的非直观行为.

由于事实NAN!=NAN,在以下顺序之后:

#include <iostream>
#include <cmath>
#include <unordered_set>

int main(){
    std::unordered_set<double> set;
    set.insert(NAN);
    set.insert(NAN);
    std::cout<<"Number of elements "<<set.size()<<"\n";  //there are 2 elements!
}
Run Code Online (Sandbox Code Playgroud)

有两个元素set(见它直播):NANNAN!

我的主要问题是,当N NANs被插入到散列集中时,它们都会击中相同的散列桶,并且N插入到散列集中的性能会退化为最坏情况下的运行时间 - O(N^2).

例如,请参阅问题末尾的列表或此处实时插入NAN比"正常"浮点数花费的时间多一些数量级.

我的问题:是否有可能(如果是 - 如何)以std::unordered_set<double>这种方式进行调整NAN,无论插入的NANs(NAN, - NAN等等)的风格如何,集合中最多只有一个元素?


清单:

#include <iostream>
#include <cmath>
#include <unordered_set>
#include <chrono>

constexpr int N=5000;
void …
Run Code Online (Sandbox Code Playgroud)

c++ ieee-754 c++11

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

使用`setp`而不是`setb`有什么好处?

编译时

double isnan(double x){
   return x!=x
}
Run Code Online (Sandbox Code Playgroud)

铛和gcc利用奇偶标志PF:

_Z6is_nand: # @_Z6is_nand
  ucomisd %xmm0, %xmm0
  setp %al
  retq
Run Code Online (Sandbox Code Playgroud)

然而,这两个可能的结果比较如下:

      NaN     Not-Nan
ZF     1        1
PF     1        0
CF     1        0
Run Code Online (Sandbox Code Playgroud)

这意味着也可以使用CF-flag作为替代,即setb代替setp.

是否有使用任何优势setpsetb,或者是一个巧合,这两个编译器使用奇偶标志?

PS:这个问题是了解std :: isnan的编译结果

c x86 gcc clang compiler-optimization

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

截断文本文件不会更改文件

当一个新手(像我一样)要求在python中读取/处理文本文件时,他经常得到如下答案:

with open("input.txt", 'r') as f:
    for line in f:
        #do your stuff
Run Code Online (Sandbox Code Playgroud)

现在我想在特殊行之后截断我正在阅读的文件中的所有内容.修改上面的例子后,我使用:

with open("input.txt", 'r+') as file:
    for line in file:
        print line.rstrip("\n\r") #for debug
        if line.rstrip("\n\r")=="CC":
           print "truncating!"  #for debug
           file.truncate();
           break;
Run Code Online (Sandbox Code Playgroud)

并期望它在看到第一个"CC"之后扔掉所有东西.在input.txt上运行此代码:

AA
CC
DD
Run Code Online (Sandbox Code Playgroud)

控制台上打印以下内容(如预期):

AA
CC
truncating!
Run Code Online (Sandbox Code Playgroud)

但文件"input.txt"保持不变!?!?

怎么可能?我做错了什么?

编辑:操作后我希望文件包含:

AA
CC
Run Code Online (Sandbox Code Playgroud)

python file truncation python-2.7 python-3.x

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

使用 gas (-fPIC) 生成位置无关代码

我尝试在 x86-64 上创建一个共享库,但失败了。问题归结为以下代码(请不要介意,它没有多大意义):

.section .data
newline:
    .ascii "\n"

.section .text
.globl write_newline
    .type write_newline, @function
write_newline: 
    mov  $newline, %rax    
    ret
Run Code Online (Sandbox Code Playgroud)

建筑如下:

as minimal.s -o minimal.o
ld -shared minimal.o -o libmin.so
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

ld: minimal.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
minimal.o: error adding symbols: Bad value
Run Code Online (Sandbox Code Playgroud)

但是gas不知道选项-fPIC,所以我不能用它重新编译:

as -fPIC minimal.s -o minimal.o
as: unrecognized option '-PIC'
Run Code Online (Sandbox Code Playgroud)

可以做些什么呢?

assembly gnu-assembler shared-libraries

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

C unsigned long long和imulq

作为一个刚接触组装的人,我使用gcc进行逆向工程.但现在我遇到了一个有趣的问题:我尝试将两个64位整数乘以x86-64.C代码如下:

unsigned long long 
val(unsigned long long a, unsigned long long b){
    return a*b;
}
Run Code Online (Sandbox Code Playgroud)

并使用gcc编译:

val:
    movq    %rdi, %rax
    imulq   %rsi, %rax
    ret
Run Code Online (Sandbox Code Playgroud)

将有符号乘法用于无符号整数可能违反直觉,但它适用于C.

但是,我想检查溢出的乘法.现在,如果结果大于2^63-1(我猜因为它毕竟是带符号的乘法),则设置溢出标志.但对于无符号的64位,只要结果不大于此值,这仍然可以2^64-1.

在这种情况下,进行乘法(在汇编中)的正确方法是什么?

c assembly gcc x86-64

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

我想基于任意掩码打包位

假设数据是1011 1001掩码0111 0110,那么你有:

input data:       1011 1001
input mask:       0111 0110
apply mask:       0011 0000 (based on `input mask`)
bits selected:    -011 -00- (based on `input mask`)
right packed:     ---0 1100
expected result:  0000 1100 (set left `8 - popcount('input mask')` bits to zero) 
Run Code Online (Sandbox Code Playgroud)

所以最终的输出是0000 1100(注意左边的3个未指定的位置是零填充的).

您可以看到,只要屏蔽位为1,input mask就会选择相应的值(在input data上面),然后所有选中的位在结果的最低有效位中连续打包(如上所示bits selected).最后,在打包后留下的任何最左边的位被设置为0(将存在right packed这样的位).

明显的选择是旋转和选择,但这将消耗5个操作,因为掩码有5位.我可以一步完成吗?

注意:

  1. 掩码可以是任意8 - popcount(mask)位的任何东西n(在上面的例子中ON).您所知道的是 …

c++ bit-manipulation bitwise-operators

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

在 cython 中使用函数指针作为模板参数包装 C++ 代码

我试图将以下用 C++ 编写的声明包装在 cython 中:

template<typename T, double (*distance)(const DataPoint&, const DataPoint&)>
class VpTree
{...}
Run Code Online (Sandbox Code Playgroud)

我还在 C++ 中得到了以下定义:

inline double euclidean_distance(const DataPoint &t1, const DataPoint &t2) {...}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其包装在 cython 中。这是我根据文档得出的结论:

cdef extern from "vptree.h":
    # declaration of DataPoint omitted here

    cdef inline double euclidean_distance(DataPoint&, DataPoint&)

    cdef cppclass VpTree[T, F]:  # F is almost certainly wrong
        ...
Run Code Online (Sandbox Code Playgroud)

并围绕它构建一个包装器:

cdef class VPTree:
    cdef VpTree[DataPoint, euclidean_distance] tree

    def __cinit__(self):
        self.tree = VpTree[DataPoint, euclidean_distance]()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致以下错误:

------------------------------------------------------------

cdef class VPTree:
    cdef VpTree[DataPoint, euclidean_distance] tree
                                            ^ …
Run Code Online (Sandbox Code Playgroud)

c++ python cython

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

Cython 中的错误消息“无法将 &lt;type_name&gt;* 转换为 Python 对象”

当我对以下 Cython 模块进行 cythonize 时

%%cython
cdef double *ptr=[1,2,3]
print(ptr)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

无法将“double *”转换为 Python 对象

但是,以下 Cython 模块:

%%cython
cdef double val=0.0
print(val)
Run Code Online (Sandbox Code Playgroud)

cythonized 没有问题。

任何其他指针类型(即int *float *等等)也会出现此问题。

python cython

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

如何在没有gil(nogil)的情况下在cython cdef中返回两个值

我有一个函数,我试图返回一个数字和一个整数向量。我拥有的是

cdef func() nogil:
    cdef vector[int] vect
    cdef int a_number
    ...
    return a_number, vect
Run Code Online (Sandbox Code Playgroud)

但这会产生像Assignment of Python object not allowed without gil. 有解决方法吗?

python cython

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