程序算法设计分析

发布于:2024-07-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

动态规划和分治、贪心相比有什么区别?各自的优缺点?

分治算法特征:

    1)规模如果很小,则很容易解决。//一般问题都能满足

    2)大问题可以分为若干规模小的相同问题。//前提

    3)利用子问题的解,可以合并成该问题的解。//关键

    4)分解出的各个子问题相互独立,子问题不再包含公共子问题。 //效率高低

【一】动态规划:

       依赖:依赖于有待做出的最优选择

       实质:就是分治思想和解决冗余。

       自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解)

         特征:动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。局部最优解

          缺点:空间需求大。

【二】贪心算法:

       依赖:依赖于当前已经做出的所有选择。

       自顶向下(就是每一步,根据策略得到一个当前最优解。传递到下一步,从而保证每一步都是选择当前最优的。最后得到结果)

【三】分治算法:

        实质:递归求解

        缺点:如果子问题不独立,需要重复求公共子问题
 

指针和引用的区别★★★★★

相同点:

都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

不同点:

指针是一个实体,而引用仅是个别名;

引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

引用没有const,指针有const,const的指针不可变;

引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

指针和引用的自增(++)运算意义不一样;

引用是类型安全的,而指针不是 (引用比指针多了类型检查

浅拷贝和深拷贝★★★

基本类型赋值时,赋的是数据(所以,不存在深拷贝和浅拷贝的问题)。

引用类型赋值时,赋的值地址(就是引用类型变量在内存中保存的内容

 如:

var arr1 = new Array(12,23,34)

Var arr2 = arr1;//这就是一个最简单的浅拷贝

如果要改变arr2所引用的数据:arr2[0]=100时,那么arr1[0]的值也是100。

        原因就是 arr1和arr2引用了同一块内存区域(以上的第二点中有体现)。

        

这是最简单的浅拷贝,因为,只是把arr1的地址拷贝的一份给了arr2,并没有把arr1的数据拷贝一份。所以,拷贝的深度不够
                       

深拷贝_如果属性是数组等非键值对的对象

      就得单独处理:要么给数组增加一个自我复制的函数(建议这样做),要么单独判断。

深拷贝应该自己再形成一个。

原文链接:https://blog.csdn.net/jiang7701037/article/details/98738487

程序的编译执行过程★★★★★★

  1. 第一步,预处理. 这一步处理 头文件、条件编译指令和宏定义。
  2. 第二步,编译. 将第一步产生的文件连同其他源文件一起编译成汇编代码。
  3. 第三步,汇编。将第二步产生的汇编源码转换为 object file.
  4. 第四步,链接. 将第三步产生的一些object file 链接成一个可执行的文件。 

*知道c++中的符号重载吗?★★★

         C++的预定义运算符的操作对象是基本的内置数据类型,对自定义数据类型,结构体或者类无法操作。符号重载可以自定义运算符的操作对象和运算规则,满足对自定义数据类型的需求。

         实质上,运算符重载就是函数重载,语法形式如下:

<返回类型说明符> operator <运算符符号>(<参数表>)

{

     <函数体>

}

函数重载的话,需要操作对象中至少有一个是用户自定义类型,避免导致重载之后出现歧义。出自之外,不能违背原本的语法规则,不能修改运算符的优先级,不能创建新的运算符等等,总之不能使得原有的运算规则出现错乱。

参考CSDNhttps://blog.csdn.net/lishuzhai/article/details/50781753

C++中如何实现多态?★★★

有一对继承关系的两个类,这两个类里面都有一个函数且名字、参数、返回值均相同,然后我们通过调用函数来实现不同类对象完成不同的事件

多态的前提:

1. 调用函数的对象必须是指针或者引用。

2. 被调用的函数必须是虚函数,且完成了虚函数的重写

https://blog.csdn.net/qq_39412582/article/details/81628254?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164171428616780265456117%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164171428616780265456117&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~hot_rank-3-81628254.nonecase&utm_term=C%2B%2B%E4%B8%AD%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%80%81&spm=1018.2226.3001.4450

*java和c++和c的区别(准备下英文)★★★★★★

参考资料:https://blog.csdn.net/weixin_42482896/article/details/93380006

百度翻译+人工润色:

1. Java不能在类之外的地方定义全局变量,只能在一个类中定义静态变量来实现一个全局变量。

C/C++可以直接在类之外定义全局变量。

Java can't define global variables outside a class, it can only define static variables in a class as a global variable.

2. Java不支持C/C++goto语句,而是通过trycatch来代替C/C++goto来处理异常时控制。

Java doesn't support "goto" statements of C/C++, but uses try/catch syntax instead of "goto" for exception control.

3. C/C++可以通过指针进行内存地址操作,例如通过指针对某内存地址进行显式类型转换,而这种操作访问私有成员破坏了安全性。

Java对指针进行完全的控制,不能在程序中进行任何指针操作,Java中的数组作为类实现,解决了关于数组的很多C/C++难以检查的错误。

C/C++ can operate memory address through pointer. For Example, C/C++ makes explicitly conversion to a memory address by pointer, which destroys the security of the program because it accesses private members. Java Controls pointer completely, and can not operate any pointer in the program. The array in Java is implemented as a class, which solves many errors about array which are difficult to check in c/c++.

4. C语言中通过mallocfree函数分配和释放内存;C++中可以通过newdelete进行内存的分配和释放。在Java通过new运算符分配内存,进行对象实例化,而分配内存时随着程序运行动态分配,Java能够进行自动管理和自动垃圾回收,防止内存资源产生的操作错误和浪费。

In C language, malloc function and free function are used to allocate and release memory; In C + +, memory can be allocated and released by new and delete keywords. In Java, the new operator is used to allocate memory and instantiate objects, and the allocated memory is dynamically allocated with the running of the program. Java can automatically manage memory and recycle garbage, so as to prevent memory operation errors and memory waste.

5. C/C++对于不同的平台,数据类型的长度不同,代码不可移植。Java对数据类型总是分配固定长度位数,保证平台无关性,可移植性好。

The length of data type of C/C++ is different in different platforms, so the code is not portable. Java always allocates a fixed number of bits to data type to ensure platform independence.

6. C++可以通过指针进行任意类型的转换,Java在进行类型转换时会进行类型相容性检查,防止不安全的转换。

C++ can do any type conversion by pointer. Java will check the type compatibility to prevent unsafe conversion.

7. C/C++中用头文件声明类的原型及全局变量、库函数,在大的系统中难以维护这些文件。Java不支持头文件,所有类成员的类型和访问权限都封装在一个类中,运行时系统对访问会进行控制防止对私有成员的操作;导入其他类要使用import语句。

In C/C++, header files are used to declare class prototypes, global variables and library functions, which are diffcult to maintain in large systems. Java does not support header files. The types and access rights of all class members are encapsulated in one class. When the program is running, the system will control the access to prevent the operation of private members.

8. C++中的结构体和联合体所有成员都是共有的,这有一定的安全问题。Java中没有结构体和联合体,一切内容都封装在类中。

All members of C++ structure and union are public, so there are some security problems. There is no structure or union in Java, everything is encapsulated in class.

9. C++支持宏定义,Java不支持宏定义,而是通过final来声明一个常量,实现宏定义中常量的定义。

C + + supports macro definition. Java does not support macro definition, but declares a constant through the final keyword to realize the definition of constant equivalent to macro definition.

  1. Java的垃圾回收算法★★★
  2. Jvm的内存管理★★★
  3. 全局变量是好是坏?★★