我有一群人,他们每个人都有朋友名单和敌人名单.我想把它们排成一行(桌子上没有圆圈),所以没有敌人,只有朋友彼此相邻.
输入示例:https://gist.github.com/solars/53a132e34688cc5f396c
我想我需要使用图形着色来解决这个问题,但我不确定如何 - 我想我必须省略朋友(或敌人)列表以使其更容易并映射到图表.
有谁知道如何解决这些问题,并告诉我,如果我走在正确的道路上?
代码示例或在线示例也不错,我不介意编程语言,我通常使用Ruby,Java,Python,Javascript
非常感谢你的帮助!
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(见它直播):NAN和NAN!
我的主要问题是,当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) 编译时
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.
是否有使用任何优势setp了setb,或者是一个巧合,这两个编译器使用奇偶标志?
PS:这个问题是了解std :: isnan的编译结果
当一个新手(像我一样)要求在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) 我尝试在 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)
可以做些什么呢?
作为一个刚接触组装的人,我使用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.
在这种情况下,进行乘法(在汇编中)的正确方法是什么?
假设数据是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位.我可以一步完成吗?
注意:
掩码可以是任意8 - popcount(mask)位的任何东西n(在上面的例子中ON).您所知道的是 …
我试图将以下用 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) 当我对以下 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 *等等)也会出现此问题。
我有一个函数,我试图返回一个数字和一个整数向量。我拥有的是
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. 有解决方法吗?