小编Chr*_*mer的帖子

随机内存访问很昂贵?

在优化我的连接四游戏引擎期间,我达到了一个点,在这一点上,进一步的改进只能是最小的,因为TableEntry te = mTable[idx + i]下面的代码示例中的指令使用了大部分CPU时间.

TableEntry getTableEntry(unsigned __int64 lock)
{
    int idx = (lock & 0xFFFFF) * BUCKETSIZE;
    for (int i = 0; i < BUCKETSIZE; i++)
    {
        TableEntry te = mTable[idx + i]; // bottleneck, about 35% of CPU usage
        if (te.height == NOTSET || lock == te.lock)
            return te;
    }
    return TableEntry();
}
Run Code Online (Sandbox Code Playgroud)

哈希表mTable定义为std::vector<TableEntry>并且具有大约4.2密耳.托管(约64 MB).我试图vector通过分配表来替换new没有速度改进的表.

我怀疑随机访问内存(因为Zobrist Hashing功能)可能很昂贵,但真的那么多?你有改进功能的建议吗?

谢谢!

编辑: BUCKETSIZE值为4.它用作碰撞策略.一个TableEntry的大小是16字节,结构如下所示: …

c++ memory optimization hash

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

给定一本字典,找到所有可能的字母排序

我最近被问到以下面试问题:

你有一个用外来语写的字典页面.假设该语言与英语类似,并且从左到右读/写.此外,单词按字典顺序排列.例如,页面可以是:ADG,ADH,BCD,BCF,FM,FN
您必须提供页面中存在的字符集的所有词典排序.

我的方法如下:A的优先级高于B,G的优先级高于H.因此,我们有关于某些字符的排序的信息:

A->B, B->F, G->H, D->F, M->N
Run Code Online (Sandbox Code Playgroud)

可能的排序可以是ABDFGNHMC,ACBDFGNHMC,......我的方法是使用数组作为位置持有者并生成所有排列以识别所有有效排序.最糟糕的情况是时间复杂度为N!其中N是字符集的大小.我们能比蛮力方法做得更好吗?

提前致谢.

language-agnostic algorithm

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

Peg solitaire - 在深度优先搜索中检查钉子与检查孔

我试图用深度优先搜索算法解决Peg Solitaire - 应该可以解决游戏,因为"现代计算机可以在合理的时间内轻松检查所有游戏位置".即使在23小时后,该算法也找不到任何解决方案.我做了一个网络搜索,发现了文章 "深度优先搜索解决了peg solitaire".我从论文中尝试了c程序,并在程序启动后立即找到了第一个解决方案.我比较了算法.算法之间的主要区别在于它们找到可能的跳跃跳跃的方式.虽然我的算法在电路板上搜索从左上角到右下角的孔(如果有可能的跳跃,则检查每个孔),纸算法在电路板上搜索从左上角到右下角的栓钉(如果有可能,检查每个栓钉)跳转).两种算法都按照找到的顺序尝试跳转.强调差异:

  • 分析漏洞:运行时间23小时无解决方案
  • 分析钉:运行时10秒,2940解决方案

问题:为什么在如何搜索电路板跳跃方面存在如此巨大的(不可解决的/立即解决的)差异?为什么检查钉子而不是检查孔是否可能跳跃更好?

您可以使用以下C++程序尝试该算法.为了保持紧凑,我删除了较不重要的部分(打印电路板,生成初始位板,......).

#include <iostream>
#include <ctime>
#include <vector>
#include <utility>
#include <ctime>

typedef unsigned __int64 ui64;
typedef std::vector<std::pair<int, int> > vecjumps; // first=from, second=to
ui64 moves = 0;    // Number of moves made so far
int solutions = 0; // Number of solutions found so far
clock_t start;     // To measure time

//          Bitboard
//   Board            Bits         
//  ------------------------------
//    ***           02 03 04 …
Run Code Online (Sandbox Code Playgroud)

algorithm depth-first-search

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

结构数组初始化和字符串文字

以下数组初始化是否正确?我想是的,但我不确定我是否可以使用const char*或者我是否应该使用std::string.除了第一个问题,char指针是否指向相同大小的内存段?

struct qinfo
{
    const char* name;
    int nr;
};
qinfo queues[] = {
    {"QALARM", 1},
    {"QTESTLONGNAME", 2},
    {"QTEST2", 3},
    {"QIEC", 4}
};
Run Code Online (Sandbox Code Playgroud)

c++

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

SQL SELECT多个INNER JOIN

它的Access数据库 ..

我有一个Library表,其中Autnm Topic Size Cover Lang外键

每个记录实际上都是一本书,其中包含作者和东西等属性.我不太确定我是否正在使用正确的JOIN ..相当新的"复杂"SQL :)

SELECT Library.Bknm_Hebrew, Library.Bknm_English, Library.Bknm_Russian, Library.Note,
       Library.ISBN, Library.Pages, Library.PUSD, Author.ID AS [AuthorID],
       Author.Author_hebrew AS [AuthorHebrew],
       Author.Author_English AS [AuthorEnglish],
       Author.Author_Russian AS [AuthorRussian], Topic.ID AS [TopicID],
       Topic.Topic_Hebrew AS [TopicHebrew], Topic.Topic_English AS [TopicEnglish],
       Topic.Topic_Russian AS [TopicRussian], Size.Size AS [Size],
       Cover.ID AS [CoverID], Cover.Cvrtyp_Hebrew AS [CoverHebrew],
       Cover.Cvrtyp_English AS [CoverEnglish], Cover.Cvrtyp_Russian AS [CoverRussian],
       Lang.ID AS [LangID], Lang.Lang_Hebrew AS [LangHebrew],
       Lang.Lang_English AS [LangEnglish],

FROM Library INNER JOIN Author ON Library.Autnm = …
Run Code Online (Sandbox Code Playgroud)

sql ms-access select join reserved-words

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

有没有像打印机标记语言这样的东西

我喜欢打印文档。文档内容为表格和不同颜色的文本。是否存在可以像模板一样使用的轻量级打印机文件格式?

在我看来,PS、PDF、DOC 文件解析起来很繁重。可能存在一些支持的 XML 或 YAML 文件格式:

  1. 轻松创建(可能使用 WYSIWYG-Editor)
  2. 使用 Library-Support 进行解析和操作
  3. 轻松发送到打印机(可能有库支持)

还是我必须按照通常的方式在 CDC 内进行绘画?

c++ xml printing markup mfc

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

64 位机器上的 DWORD 和 DWORD_PTR

*_PTR为支持 Win64 的 64 位寻址,向 Windows API 添加的类型很少。

SetItemData(int nIndex,DWORD_PTR dwItemData)
Run Code Online (Sandbox Code Playgroud)

当我将第二个参数作为DWORD.

我想知道,如果这个特定的 API 会在 64 位机器上失败,如果我将第二个参数作为DWORD. 如何测试失败场景?

谢谢,尼基尔

windows winapi mfc

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

ORDER BY优化是否在以下SELECT语句中生效?

我有一个SELECT声明,我想优化.在MySQL的-为了通过优化说,在某些情况下,该指数不能用来优化ORDER BY.具体来说:

在键的非连续部分使用ORDER BY
SELECT*FROM t1 WHERE key2 = constant ORDER BY key_part2;

让我思考,这可能是这种情况.我正在使用以下索引:

UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`),
KEY `met_value_index` (`DATETIME`,`RTU_NB`)
Run Code Online (Sandbox Code Playgroud)

使用以下SQL语句:

SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY mp_nb, datetime
Run Code Online (Sandbox Code Playgroud)
  • 难道是足够删除索引met_value_index1,并与新的排序创建它RTU_NB,MP_NB,DATETIME
  • 我是否必须将RTU_NB包含在该ORDER BY子句中?


结果:我已经尝试了@meriton的建议并添加了索引met_value_index2.该SELECT1.2秒完成后,以前它5.06秒后完成.以下不属于问题,但作为旁注:经过一些其他尝试后,我将引擎从MyISAM切换到InnoDB - 使用rtu_nb, mp_nb, datetime主键 - 并且语句在0.13秒后完成!

mysql sql optimization database-indexes

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

交换两个序列的元素,使元素和的差异变得最小.

面试问题:

给定两个非有序整数序列ab,其大小为n时,所有的数字是随机选取的:交换的元素ab,使得所述元素的总和a减去的元素的总和b是最小的.

举个例子:

a = [ 5 1 3 ]
b = [ 2 4 9 ]
Run Code Online (Sandbox Code Playgroud)

结果是(1 + 2 + 3) - (4 + 5 + 9)= -12.

我的算法:将它们排序在一起,然后将第一个最小的n整数放入a和放入b.它的时间为O(n lg n),空间为O(n).我不知道如何将其改进为时间为O(n)且空间为O(1)的算法.O(1)意味着除了seq 1和2之外我们不需要更多的额外空间.

有任何想法吗 ?

另一个问题是:如果我们需要最小化差异的绝对值(最小化|sum(a) - sum(b)|)怎么办?

首选python或C++思想.

c++ python algorithm data-structures

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

如何更快地制作这个简单的fortran 90代码?

我试图比较一个简单代码的计算时间,使用Fortran 90和C++来计算整数的立方总和,因为我听说它们在类似的级别上很快.我使用gfortran和g ++(在Mac OSX上)来编译这些代码.

有人可以指出为什么Fortran 90代码比同等的C++代码(12秒)花费的时间(49秒)要多得多吗?我只知道C++是行专业,而Fortran是专栏专栏,但我认为这与这些代码无关.如何让这个fortran90代码更快?任何提示将不胜感激.谢谢.

Fortran代码和编译 gfortran -o bb1 code15.f90

program code15 
implicit none

double precision, dimension(:), allocatable :: a
integer (kind=8) :: n,i
real (kind=16) :: ssum
real :: ts1, ts2

call cpu_time(ts1)
n = 1600000000
allocate(a(n))
ssum=0.0

do i=1,n
    a(i)=i
    ssum=ssum+a(i)*a(i)*a(i)
end do

print *, 'final sum ', ssum
deallocate(a) 
call cpu_time(ts2)
print *,'the time taken is ',ts2-ts1

end program
Run Code Online (Sandbox Code Playgroud)

输出是

 final sum    1.63840000204800000399876515667619840E+0036
 the time taken is    48.6228256
Run Code Online (Sandbox Code Playgroud)

C++代码和编译 g++ -o bb1 code10.cpp

#include <iostream>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ performance gfortran fortran90

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