小编caf*_*caf的帖子

独特的排列,没有镜像或循环重复

一些背景:我正在编写或多或少的强力搜索算法来解决我遇到的问题.为了做到这一点,我需要生成并评估所有可能性,以找出哪个是最好的.由于评估实际上需要一些时间,我宁愿尽可能少地生成完全覆盖我的搜索空间的解决方案.此外,我可以做的更多元素越多越好.对于任何数字K,通常有K!对于高于~10的数字,排列和生成它们都很难.

真正的问题:搜索空间应包含两个元素的所有排列(N次el1和M乘以el2,其中K = M + N),具有以下限制:

  1. 他们必须是独一无二的(即我只想要[aabbb]一次)
  2. 我不需要任何排列的反转(即如果我有[aab],我也不需要[baa])
  3. 我认为排列是圆形的,所以[aab] = [aba] = [baa]

如果我能够做到这一点,可能性的数量将大大减少.由于理想情况下K很大,因此首先生成所有排列然后根据这些标准过滤它们是不可行的.我已经完成了第一个限制(见下文),它将Matlab的正常排列函数(perms)的数量从2 ^ K减少到K!/ N!M !,这是一个巨大的胜利.第二个限制只会将可能性的数量减少一半(在最好的情况下),但我认为第三个也应该能够真正减少可能性的数量.

如果有人知道怎么做,最好还有如何计算会有多少种可能性,这对我有很大的帮助!我更喜欢解释,但代码也很好(我可以读C语言,Java(脚本),Python,Ruby,Lisp/Scheme).


对于感兴趣的:这是迄今为止我只获得唯一排列的算法:

function genPossibilities(n, m, e1, e2)
     if n == 0
         return array of m e2's
     else
         possibilities = genPossibilities(n-1, m, e1, e2)
         for every possibility:
             gain = number of new possibilities we'll get for this smaller possibility*
             for i in max(0,(m+n-gain))
                 if possibility(i) is not e1
                     add possiblity with e1 inserted in position i
         return new possibilities
Run Code Online (Sandbox Code Playgroud)
  • 如果您有N-1和M的所有排列,那么您可以使用它们通过将e1插入其中来查找N和M的排列.你不能只是在任何地方插入,因为那样你就会得到重复.我不知道为什么会这样,但你可以计算出你从旧的可能性中产生的新可能性的数量(我称之为"增益").对于第一个旧排列,该数字从M + 1开始,并且对于每个旧排列减少一个,直到它变为零,此时它返回到M等等(仅当M> = …

algorithm permutation combinatorics necklaces

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

在ruby中定义全局方法的方法

我正在写一个小宝石,我要定义一个DSL样方法,几乎是一样的desc,并task在方法.

Rake将它们定义为Rake::DSL模块中的私有方法然后

self.extend Rake::DSL
Run Code Online (Sandbox Code Playgroud)

将模块混合到主对象中?(如果我错的话,我是新手并继续笑)

这样做有什么好处?是因为将这些方法设为私有可以阻止任何其他对象使用它们(也就是说,为了防止这样的事情some_obj.desc)?

如果我定义方法怎么办? Kernel

module Kernel
  private

  include Rake::DSL
end
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?

ruby global

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

遗失了什么或者我只是不了解epoll?

完全披露,我是学生,这是一项任务.我已经工作了一个多星期几乎不停(除了以前花的时间),我无法弄清楚我做错了什么.我的服务器一直挂在epoll_wait后,只有"少数" RECVS完成("少数",因为我期待几个GB的数据和我得到的只有几十MB).我不认为我的客户端如何工作有任何问题,因为它与我的选择和多线程服务器一起工作得很好.请快速浏览一下,让我知道是否有任何事情因为我的问题导致你跳出来.

客户端/服务器的基本思想是用连接(10k +)轰炸服务器并多次传输给定数量的数据.这个epoll服务器在2000年遇到了麻烦,当时我的多线程服务器只处理了10k的目标.

我不是要求你为我做任务(我差不多完成了)我只是需要帮助弄清楚我在这里做错了什么.在此先感谢您提供的任何帮助:)

  1 #include "common.h"
  2 #include <sys/epoll.h>
  3 
  4 uint16_t ready[MAX_CONNS];
  5 uint16_t next;
  6 pthread_mutex_t mutex;
  7 
  8 void *worker_thread(void *param) {
  9     int my_sock, pos;
 10     struct conn_params *conn_ps = (struct conn_params *)param;
 11 
 12     while (1) {
 13         pthread_mutex_lock(&mutex);
 14 
 15         while (1) {
 16             if (next == MAX_CONNS) {
 17                 printf("balls\n");
 18                 next = 4;
 19             }
 20 
 21             if (ready[next] != 0) {
 22                 pos = next;
 23                 my_sock = ready[pos]; …
Run Code Online (Sandbox Code Playgroud)

c sockets linux epoll pthreads

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

在Scheme中生成项链的简单算法很好?

长度为n的k-ary项链是长度为n的有序列表,其项目是从长度为k的字母表中绘制的,这是按字典顺序排列的第一个列表,在所有列表中共享旋转下的排序.

示例:(1 2 3)和(1 3 2)是字母{1 2 3}中长度为3的项链.

更多信息:http: //en.wikipedia.org/wiki/Necklace_(bizbinicsics)

我想在Scheme(或你选择的Lisp)中生成这些.我找到了一些论文......
野人 - 一种生成项目的新算法
Sawada - 在恒定摊销时间生成手镯
Sawada - 生成带有禁止的子串的项链
......但是它们中的代码对我来说是不透明的.主要是因为他们似乎没有传递字母或所需的长度(n).我正在寻找的方案程序是形式(项链n'(ab c ...)).

通过首先生成k ^ n个列表然后过滤掉旋转,我可以很容易地生成这些.但它的内存效率非常低......

谢谢!

scheme combinatorics necklaces

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

如何使用rspec存根/模拟对命令行的调用?

我正在尝试从命令行工具测试输出.如何使用rspec"伪造"命令行调用?执行以下操作不起作用:

it "should call the command line and return 'text'" do
  @p = Pig.new
  @p.should_receive(:run).with('my_command_line_tool_call').and_return('result text')
end
Run Code Online (Sandbox Code Playgroud)

如何创建该存根?

ruby command-line rspec

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

USB端口速度Linux

如何以编程方式确定运行Linux内核的嵌入式设备中的USB端口速度?

usb linux-kernel embedded-linux

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

如何解决GCC警告,"XXX的地址永远不会为NULL"?

我正在研究一个C程序.有一个函数需要两个指针参数,调用它cmp().cmp()出于说明的原因,我在这里提供了一个简化的替身:

int cmp(struct foo *a, struct foo *b)
{
    return a->bar == b->bar;
}
Run Code Online (Sandbox Code Playgroud)

我想制作一个NULL-check宏,如下所示:

#define SAFE_CMP(a,b) (((a) != NULL && (b) != NULL) ? cmp((a),(b)) : 0)
Run Code Online (Sandbox Code Playgroud)

我觉得这很好.但是,在使用-Wall以及将警告视为错误的compliation开关进行编译时,以下代码很麻烦:

int baz(struct foo *a)
{
   struct foo b;
   /* ... */
   return SAFE_CMP(a, &b); 
}
Run Code Online (Sandbox Code Playgroud)

因为gcc警告"b的地址永远不会为NULL".

有没有办法解决这种情况?具有多种辅助宏象SAFE_CMP_1(safe_arg,unsafe_arg)SAFE_CMP_2(unsafe_arg,safe_arg)等是我想要的最后一件事.我想让一个助手宏适用于所有情况.

c macros gcc compiler-warnings suppress-warnings

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

我可以确定终端是否解释C1控制代码?

ISO/IEC 2022定义了C0和C1控制代码.在C0组之间是熟悉的代码0x000x1f在ASCII,ISO-8859-1和UTF-8(例如ESC,CR,LF).

一些VT100终端仿真器(例如screen(1),PuTTY)也支持C1集.这些值之间0x800x9f(因此,例如,0x84向下移动光标的线).

我正在显示用户提供的输入.我不希望用户输入能够改变终端状态(例如移动光标).我目前正在过滤出C0集中的字符代码; 但是我想有条件地过滤出C1集,如果终端将它们解释为控制码.

有没有办法从数据库中获取此信息termcap

unix gnu-screen ncurses vt100 termcap

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

搞清楚cuda内核有多少块和线程,以及如何使用它们

我一直在试图弄清楚如何制作我认为是一个简单的内核来获取2d矩阵中的值的平均值,但是我有一些问题让我的思维过程直接进行.

根据我的deviceQuery输出,我的GPU有16MP,32cores/mp,块最大为1024x1024x64,我有一个最大线程/块= 1024.

所以,我正在处理一些大型图像.也许5000px x 3500px或类似的东西.我的一个内核是在图像中的所有像素上取平均值.

现有代码将图像存储为2D数组[rows] [cols].因此,在C中,内核看起来像你期望的那样,循环遍历行,并且循环遍历cols,计算在中间.

那么如何在CUDA中设置此代码的维度计算部分?我已经查看了SDK中的缩减代码,但这是针对单维数组的.它没有提到如何设置块数和线程数,当你有soemthing 2D时.

我想我实际上需要像这样设置它,这就是我希望有人能够帮助你的地方:

num_threads=1024;
blocksX = num_cols/sqrt(num_threads);
blocksY = num_rows/sqrt(num_threads);
num_blocks = (num_rows*num_cols)/(blocksX*blocksY);

dim3 dimBlock(blocksX, blocksY, 1);
dim3 dimGrid(num_blocks, 1, 1);
Run Code Online (Sandbox Code Playgroud)

这似乎对设置有意义吗?

然后在内核中,要处理特定的行或列,我必须使用

rowidx =(blockIdx.x*blockDim.x)+ threadId.x colidx =(blockIdx.y*blockDim.y)+ threadId.y

至少我认为这对于获得行和列是有效的.

那么我如何访问内核中的特定行r和列c?在cuda编程指南中,我找到了以下代码:

// Host code int width = 64, height = 64;
float* devPtr; size_t pitch;
cudaMallocPitch(&devPtr, &pitch, width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code __global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int …
Run Code Online (Sandbox Code Playgroud)

c++ cuda gpu gpgpu

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

C++ OpenSSL导出私钥

到目前为止,我已成功使用SSL,但遇到了令人困惑的障碍.我生成一个RSA密钥对,之前使用PEM_write_bio_RSAPrivateKey(...)来导出它们.然而,手册页声称格式已过时(实际上它看起来与通常的PEM格式不同).相反,它建议PEM_write_bio_PKCS8PrivateKey(...).

但是,PEM_write_bio_PKCS8PrivateKey接受EVP_PKEY对象.如何将我的RSA*密钥对转换为EVP_PKEY*结构以便在该函数中使用?

EVP_PKEY* evpkey = EVP_PKEY_new();
if (!EVP_PKEY_assign_RSA(evpkey, keypair))
    throw ReadError();
int ret = PEM_write_bio_PKCS8PrivateKey(bio, evpkey, EVP_aes_256_cbc(),
                                        pass_char_str, pass_len, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

ret始终为0.使用较旧的PEM_write_bio_RSAPrivateKey对我有用.我想要导出我的键,所以他们看起来像:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCvdbGZes3N/v3EqbbwYHW4rr4Wgav9eD36kVD7Hn5LIKwhfAqd
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ openssl cryptography rsa pem

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