在某些情况下,通常使用足够大的整数值来表示无穷大.我通常使用最大可表示的正/负整数.这通常会产生更多代码,因为您需要在几乎所有算术运算之前检查其中一个操作数是否为无穷大,以避免溢出.有时需要进行饱和整数运算.出于这个原因,有些人使用较小的无穷大值,可以添加或倍增几次而不会溢出.引起我兴趣的是,这一事实非常普遍(特别是在编程竞赛中):
const int INF = 0x3f3f3f3f;
Run Code Online (Sandbox Code Playgroud)
为什么这个号码特别?它的二进制表示是:
00111111001111110011111100111111
Run Code Online (Sandbox Code Playgroud)
我在这里看不到任何特别有趣的财产.我看到输入很容易,但如果这是原因,几乎任何事情都可以(0x3e3e3e3e,0x2f2f2f2f等).它可以添加一次而不会溢出,这允许:
a = min(INF, b + c);
Run Code Online (Sandbox Code Playgroud)
但是,所有其他常数都会这样做.谷歌搜索只显示了很多使用该常量的代码片段,但没有解释或评论.
谁能发现它?
对于习惯于编程的人来说,有时很难在不使用数组/向量的情况下在函数式语言中编写高效的代码.然而,似乎总有一种聪明的方法.例如,排序可以在命令式和声明式编程语言中的O(n*log(n))时间内完成,并且交换操作的缺乏不是真正的问题.
考虑一种函数式编程语言,它没有数组或任何可以在恒定时间内访问任意元素的数据结构.例如,在没有数组的情况下获取SML或Haskell的子集.
当然,每个可计算的问题都可以通过用这种语言编写的程序来解决.但我想知道是否存在任何本质上无法在命令式世界之外有效解决的问题.通过"有效",我的意思是最多同时解决问题的最着名的命令式算法的复杂性.
例如,只使用SML或Haskell中的列表可以有效地计算矩阵乘法吗?
theory arrays complexity-theory haskell functional-programming
我并不是真正的C设计模式,所以我的疑问可能很简单(虽然有点具体).这个问题的真正应用难以解释,所以让我简化一下.
假设我有一个数组,我想在其中存储素数.此数组包含的素数的数量由NUMBER_OF_PRIMES在编译时定义的常量定义.
因此,我们有:
unsigned primes[NUMBER_OF_PRIMES];
Run Code Online (Sandbox Code Playgroud)
如果大小是固定的,我可以预先计算素数并像往常一样初始化数组:
unsigned primes[NUMBER_OF_PRIMES] = { 2, 3, 5, 7, ... };
Run Code Online (Sandbox Code Playgroud)
但是,如果这将是相当丑陋的NUMBER_OF_PRIMES人,比方说,大于200我想一些方法来运行在运行时的功能,但在此之前的main(),这将把那些素数号码出现.我当然可以这样做:
unsigned* primes = make_primes(NUMBER_OF_PRIMES);
Run Code Online (Sandbox Code Playgroud)
这将分配必要的内存并在main之前运行.主要问题是:此数组将位于头文件中,但它的值将包含隐藏在相应.c文件中的内容.我认为我能做的是:
/* Header file */
unsigned primes[NUMBER_OF_PRIMES];
/* C file */
int nothing = initialize_primes(); /* This function would write the
values to the array, using things that are not available in the
header (it is in the .c, so it can reference them), and return anything */
Run Code Online (Sandbox Code Playgroud)
另一种方法显然是放入initialize_primes()头文件,并要求用户在main函数内调用它(就像一些库的init()函数).但是,我不想强制main()包含对此函数的调用. …
请考虑以下代码:
template <typename T>
class C2 {
public:
T method() { }
int method2() { }
};
Run Code Online (Sandbox Code Playgroud)
编译它g++ -Wall -c -pedantic会给我以下警告:
test.cpp: In member function ‘int C2<T>::method2()’:
test.cpp:4:29: warning: no return statement in function returning non-void [-Wreturn-type]
这是预期的.奇怪的是,它method()也没有返回任何东西.为什么不产生一个警告,因为实例化C2与T = int将调用这两种方法同样危险?