在快速查找算法的此实现中,构造函数采取N步骤union().
教师说这对于处理对象上的命令序列union来说太昂贵了,当它一次访问一个数组元素时,怎么可能是二次的呢?N^2N unionNunion
public class QuickFind
{
private int[] id;
public QuickFind(int N) {
id = new int[N];
for (int i=0; i<N; i++) {
id[i] = i;
}
}
public boolean connected(int p, int q) {
return id[p] == id[q];
}
public void union(int p, int q) {
int pid = id[p];
int qid = id[q];
for (int i=0; i<id.length; i++)
if (id[i] == pid)
id[i] …Run Code Online (Sandbox Code Playgroud) 在阅读C book中的Compiler Design时,我遇到了以下规则来描述无上下文语法:
识别一个或多个语句列表的语法,每个语句都是一个后跟分号的算术表达式.语句由一系列以分号分隔的表达式组成,每个表达式包含一系列由星号(用于乘法)或加号(用于加法)分隔的数字.
这是语法:
1. statements ::= expression;
2. | expression; statements
3. expression ::= expression + term
4. | term
5. term ::= term * factor
6. | factor
7. factor ::= number
8. | (expression)
Run Code Online (Sandbox Code Playgroud)
该书指出这种递归语法存在一个主要问题.几个产品的右侧出现在生产3的左侧(并且此属性称为左递归),并且某些解析器(如递归下降解析器)无法处理左递归生成.他们只是永远地循环.
您可以通过考虑解析器在替换具有多个右侧的非终端时如何决定应用特定生产来理解该问题.简单的情况在制作7和8中很明显.解析器可以通过查看下一个输入符号来选择在扩展因子时应用哪个制作.如果此符号是数字,则编译器应用Production 7并用数字替换该因子.如果下一个输入符号是一个左括号,则解析器将使用Production 8.但是,Productions 5和6之间的选择无法以这种方式解决.在生产6的情况下,术语的右侧以一个因子开始,该因子以数字或左括号开始.因此,解析器希望在替换术语时应用Production 6,并且下一个输入符号是数字或左括号.生产5-另一个右侧 - 以一个术语开始,该术语可以以一个因子开始,该因子可以以数字或左括号开头,这些是用于选择生产6的相同符号.
书中的第二句话让我彻底迷失了.所以通过使用一些语句的例子(例如)5 + (7*4) + 14:
compiler-construction recursion parsing recursive-descent left-recursion
我无法弄清楚如何返回对vector元素的引用.[]和at()返回引用,不是吗?
但是当我尝试以下内容时,它将无法编译.
我使用的是Visual C++,它 不能将'const float'转换为'float& error.
T& GetElement(size_t x) const {
return _vector.at(x);
}
Run Code Online (Sandbox Code Playgroud)
GetElement是一个方法,_vector是一个成员变量.
为什么这个断言失败了?
import std.conv;
void main()
{
auto y = 0.6, delta=0.1;
auto r = to!int(y/delta);
assert(r == 6);
}
Run Code Online (Sandbox Code Playgroud)
r的值应该是6而它是5,为什么?
我正在尝试使用以下python代码解决一组方程式(当然使用SymPy):
def Solve(kp1, kp2):
a, b, d, e, f = S('a b d e f'.split())
equations = [
Eq(a+b, 2.6),
Eq(2*a + b + d + 2*f, 7),
Eq(d + e, 2),
Eq(a*e,kp2*b*d),
Eq( ((b * (f**0.5))/a)*((a+b+d+e+f+13.16)**-0.5), kp1)
]
return solve(equations)
Run Code Online (Sandbox Code Playgroud)
该代码成功地解决了方程,但是大约35秒后.该Solve()函数在另一个文件中的迭代块(大约2000次迭代)中使用,因此速度对我来说非常重要.
有没有办法加速求解器?如果没有,你能推荐另一种方法来解决使用python的方程组吗?
如果随机访问迭代器可以用来访问相对于它们所指向的元素的任意偏移位置的元素(不知何故像指针),为什么不能在通用算法std::copy()中使用它们而不是使用它们back_insert_iterator,两者之间的区别是什么?
我知道它的out工作方式非常类似于ref它在进入函数时将传递的参数初始化为其默认值.
我的问题是在"在函数输入时重置变量"这有什么用处?
如果有人能给我一个out比这更有用的例子,那就太棒了ref.
我提出以下用于搜索字符串的两个代码S2在串S1,如果S2中发现S1在那里发现匹配被打印和位置的,则地址 S1应该从匹配的位置被打印到的最后一个字符S1.如果s1 ="上帝是伟大的"并且s2 ="是"那么应该打印匹配的地址以及"很棒".
CODE 1:
#include<stdio.h>
#include<string.h>
void main()
{
char s1[80]="god is great",s2[10]="is";
char *searchptr;
searchptr=strstr(s1,s2);
printf("%p\n%p\n",searchptr,s1);
sprintf(s1,"%s",searchptr);
puts(s1);
}
CODE 2:
#include<stdio.h>
#include<string.h>
void main()
{
char s1[80],s2[10];
char *aptr;
printf("%s\n%s\n","enter a line","enter string to be searched");
fgets(s1,80,stdin);
printf("\n");
fgets(s2,10,stdin);
aptr=strstr(s1,s2);
printf("%p\n,aptr);
sprintf(s1,"%s",aptr);
puts(s1);
}
Run Code Online (Sandbox Code Playgroud)
在第一个代码中,我已经初始化了字符串及其工作,但第二个代码给出了意想不到的结果.它给出了匹配的地址在每种情况下(我已经尝试过)aptr = 0000000.使用fgets有什么不对,因为在第二个代码我想从键盘输入?
我有一个关于如何在c ++中实现基本文件传输client\server的基本问题.
我不确定为什么在一个read\write中发送文件不是一个好方法,为什么好的方法是将它发送到一小块缓冲区呢?