这是一个面试问题:
给定一个包含40亿个整数的输入文件,提供一个算法来生成一个未包含在文件中的整数.假设您有1 GB内存.如果您只有10 MB内存,请跟进您的操作.
我的分析:
文件大小为4×10 9 ×4字节= 16 GB.
我们可以进行外部排序,因此我们可以了解整数的范围.我的问题是在排序的大整数集中检测缺失整数的最佳方法是什么?
我的理解(阅读完所有答案后):
假设我们正在讨论32位整数.有2 ^ 32 = 4*10 9个不同的整数.
情况1:我们有1 GB = 1*10 9*8位= 80亿位内存.解决方案:如果我们使用一个代表一个不同整数的位,那就足够了.我们不需要排序.执行:
int radix = 8;
byte[] bitfield = new byte[0xffffffff/radix];
void F() throws FileNotFoundException{
Scanner in = new Scanner(new FileReader("a.txt"));
while(in.hasNextInt()){
int n = in.nextInt();
bitfield[n/radix] |= (1 << (n%radix));
}
for(int i = 0; i< bitfield.lenght; i++){
for(int j =0; j<radix; j++){
if( (bitfield[i] & (1<<j)) == 0) System.out.print(i*radix+j);
}
}
}
Run Code Online (Sandbox Code Playgroud)
情况2:10 MB内存= …
我有一台1 MB RAM的计算机,没有其他本地存储.我必须使用它通过TCP连接接受100万个8位十进制数,对它们进行排序,然后通过另一个TCP连接发送排序列表.
数字列表可能包含重复项,我不能丢弃.代码将放在ROM中,因此我不需要从1 MB中减去代码的大小.我已经有驱动以太网端口和处理TCP/IP连接的代码,它的状态数据需要2 KB,包括1 KB缓冲区,代码将通过该缓冲区读写数据.有这个问题的解决方案吗?
问答来源:
slashdot.org
这是从运行脚本以检查Tensorflow是否正常工作时收到的消息:
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available …
Run Code Online (Sandbox Code Playgroud) 在编写优化ftol
函数时,我发现了一些非常奇怪的行为GCC 4.6.1
.让我先向您展示代码(为清楚起见,我标记了差异):
fast_trunc_one,C:
int fast_trunc_one(int i) {
int mantissa, exponent, sign, r;
mantissa = (i & 0x07fffff) | 0x800000;
exponent = 150 - ((i >> 23) & 0xff);
sign = i & 0x80000000;
if (exponent < 0) {
r = mantissa << -exponent; /* diff */
} else {
r = mantissa >> exponent; /* diff */
}
return (r ^ -sign) + sign; /* diff */
}
Run Code Online (Sandbox Code Playgroud)
fast_trunc_two,C:
int fast_trunc_two(int i) {
int mantissa, exponent, …
Run Code Online (Sandbox Code Playgroud) 我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?有没有更好的方法来做同样的事情?
我在cppreference的文档中看到了这个例子std::numeric_limits
#include <limits>
#include <iostream>
int main()
{
std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";
std::cout << "uchar\t"
<< +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::max() << '\n';
std::cout << "int\t"
<< std::numeric_limits<int>::lowest() << '\t'
<< std::numeric_limits<int>::min() << '\t'
<< std::numeric_limits<int>::max() << '\n';
std::cout << "float\t"
<< std::numeric_limits<float>::lowest() << '\t'
<< std::numeric_limits<float>::min() << '\t'
<< std::numeric_limits<float>::max() << '\n';
std::cout << "double\t"
<< std::numeric_limits<double>::lowest() << '\t'
<< std::numeric_limits<double>::min() << '\t'
<< std::numeric_limits<double>::max() …
Run Code Online (Sandbox Code Playgroud) 我在回答问题时曾与一位新的C++开发人员合作:"为什么变量名称不能以数字开头?"
我无法想出答案,除了一些数字可以包含文本(123456L,123456U),如果编译器认为所有带有一些字母字符的数字都是变量名称,那就不可能.
这是正确的答案吗?还有其他原因吗?
string 2BeOrNot2Be = "that is the question"; // Why won't this compile?
Run Code Online (Sandbox Code Playgroud) c++ variables programming-languages language-design variable-names
你能想到运行时代码修改的任何合法(智能)用法(程序在运行时修改它自己的代码)吗?
现代操作系统似乎对执行此操作的程序不屑一顾,因为病毒已使用此技术来避免检测.
我能想到的是某种运行时优化,它可以通过在运行时知道某些在编译时无法知道的东西来删除或添加一些代码.
executable platform-agnostic cpu-architecture instructions self-modifying
我知道,这个问题似乎很奇怪.程序员有时会想太多.请继续阅读......
在CI中使用signed
和unsigned
整数很多.我喜欢这样一个事实:如果我执行诸如将有符号整数分配给无符号变量之类的操作,编译器会发出警告.如果我将带符号与无符号整数进行比较,我会得到警告.
我喜欢这些警告.他们帮助我保持我的代码正确.
为什么我们不能为花车提供同样的奢侈品?平方根绝对不会返回负数.还有其他地方负浮动值没有意义.无符号浮点数的完美候选者.
顺便说一句 - 我并不是真的热衷于通过从浮点数中移除符号位来获得的单一额外精度.float
因为他们现在对我非常满意.我只想将浮点数标记为无符号,并获得与整数相同的警告.
我不知道任何支持无符号浮点数的编程语言.
知道为什么他们不存在吗?
我知道x87 FPU没有处理无符号浮点数的指令.让我们使用带符号的浮点指令.滥用(例如,低于零)可以被认为是未定义的行为,就像未定义有符号整数的溢出一样.
我觉得我必须无法找到它.有什么理由说c ++ pow函数没有为浮点数和双精度数以外的任何东西实现"幂"函数吗?
我知道实现是微不足道的,我只是觉得我正在做一个应该在标准库中的工作.强大的幂函数(即以某种一致,明确的方式处理溢出)编写起来并不好玩.