Dylanの博客

记录生活,记录成长

0%

第十二周课后总结

图灵机

图灵机实质是一个数学模型,包括一条无限长的纸带type,一个读写头Head,控制器(包含控制规则集合以及状态寄存器)
图灵机将求解问题的求解方法转换成控制规则,进而一步步解决问题。

示例(当前状态,当前数值,改变后的数值,移动方向或者保持,下一步的状态)

计算机科学的定义

计算机学科的基本思路
#理论是数学的根本
#抽象是自然科学的根本
#设计是工程的根本
计算机科学的三个学科形态
#理论,抽象和设计
#计算机科学处于三者的交汇处
计算机科学的含义
计算机科学是处理信息的学科
它是对描述和变换信息的算法过程的系统研究
计算机科学的基本问题—什么能(有效地)自动进行

拓展1:信息战
拓展2:bing搜索

个人计算机

冯·洛伊曼体系

存储程序:
#计算机内部采用二进制计数
#程序有一列指令构成,程序和数据存放在内存储器中,进行统一编制,并按同样方法存取
#采用并行计算原理,对一个字的各位同时进行处理
#将编号的程序和原始数据实现存入内储器中,计算机在程序的控制下一步一步处理,直到得出结果。
在这里插入图片描述

个人计算机的硬件子系统

这里是引用在这里插入图片描述

第十三周课后总结

1.计算机系统结构

它是计算机的机器语言程序员或编译程序编写者所看到的外特性。所谓外特性,就是计算机的概念性结构和功能特性,主要研究计算机系统的基本工作原理,以及在硬件、软件界面划分的权衡策略,建立完整的、系统的计算机软硬件整体概念。

2.移动智能终端

它拥有接入互联网能力,通常搭载各种操作系统,可根据用户需求定制化各种功能。生活中常见的智能终端包括移动智能终端、车载智能终端、智能电视、可穿戴设备等。

3.计算机网络

它是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
#定义:分为按广义,按需求,按连接 #组成:计算机、网络操作系统、传输介质(可以是有形的,也可以是无形的,如无线网络的传输介质就是空间)以及相应的应用软件四部分
在这里插入图片描述

4.云计算*

是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。
云计算早期,简单地说,就是简单的分布式计算,解决任务分发,并进行计算结果的合并。因而,云计算又称为网格计算。通过这项技术,可以在很短的时间内(几秒种)完成对数以万计的数据的处理,从而达到强大的网络服务。
现阶段所说的云服务已经不单单是一种分布式计算,而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果

5.物联网

是指通过 各种信息传感器、射频识别技术、 全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、
连接、互动的物体或过程,采集其声、光、热、电、力学、化
学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络
在这里插入图片描述

第十四周课后总结

软件的定义

软件是用户与硬件之间的接口 软件=程序+数据+文档
软件是计算机系统设计的重要依据,在设计计算机系统时必须统筹规则好软件与硬件的层次关系,兼顾用户的要求。

软件的分类

功能:(1)系统软件 a.操作系统:所有软件运行的基础
b.支撑软件
(2)应用软件规模:微型、小型、中型、大型、甚大型、极大型
必须有软件工程的知识作为指导,遵循一定的开发规范工作方式 (1)实时处理文件:数据采集、分析、输出
(2)分时软件:Windows、Linux
(3)交互式软件:人-机通信
(4)批处理软件

软件构架

(1)定义:软件构架是有关软件整体结构和组件的抽象模式,用于指导大型软件的设计,是一个系统的草图。其描述的对象是直接构成系统的抽象组件。为变化而设计,具有可扩充性和可移植性。

(2)分层:降低了层与层之间的耦合度,应用程序专用功能位于高层,跨越运用程序领域位于中层,配置环境专用功能位于底层

分层标准:可见度,易变性,通用性,层数

操作系统

定义:计算机运行的第一个程序,是应用程序与计算机硬件的“中间人”
系统观点:是计算机软件的核心,是计算机系统的大脑,整个系统的控制中心

用户观点:命令方式,系统调用,图形界面

软件观点:操作系统是直接与硬件相邻的第一层软件

(1)Dos:是个人计算机上使用的一种操作系统,通过在命令行方式下输入命令对计算机资源进行管理

(2)Windows:采用双模式结构,操作系统核心运行在内核模式,应用程序的代码运行在用户模式

(3)UNIX:一个通用的、多任务、交互式的分时操作系统:内核、Shell、文件系统、公用程序
结构简洁、功能强、可移植性和兼容性较好 (4)Linux:模块化程度高、源代码公开、广泛的硬件支持、安全性及可靠性好、完整的网络集成
(5)Mac OS:基于UNIX 简单易用、稳定可靠 Classic Mac OS及Mac OSX

软件的开发

(1)软件工程:a.软件危机:计算机软件的开发维护过程中所遇到的一系列的严重问题

b.学科定义:研究用工程化方法构建和维护有效、实用和高质量软件的学科

(2)软件开发过程:问题定义>>>可行性研究>>>需求分析>>>总体设计>>>详细设计>>>程序开发>>>软件测试>>>软件维护

(3)用户界面与用户体验:

a.用户界面:设计三大原则:置界面于用户的控制之下,减少用户的记忆负担,保持界面的一致性

设计流程:确认目标用户>>>采集目标用户的习惯交互方式>>>提示和引导用户

b.用户体验:目标:有用、易用、友好

c.一致性和可用性原则

软件行业职业简介

项目管理类、开发类、测试类、系统类、安全类、维护类、销售类

前言

本文是leetcode 第一题两数之和c++解法

一、两数之和题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]

二、解题

1.c++暴力法解决

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i, j;
for (i = 0; i < nums.size(); i++)
{
for (j = i + 1; j < nums.size();j++)
{
if (nums[i] + nums[j] == target)
return { i,j };
}
}
return { i,j };
}

};

int main() {
vector<int> twoSum = { 2, 7, 11, 15 };
int n = 9;
vector <int> k;
Solution x;
k = x.twoSum(twoSum, n);
for (int i = 0; i <= 1; i++)
{
cout << k[i];
}
return 0;
}

注意这里的解题过程是在编译器中的运行代码,来leetcode上提交只需要提交solution类即可。

注:vector是c++容器,某种意义上可以当作数组来用

2.两遍哈希表

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
int r1, r2;
for (int i = 0; i < nums.size(); i++)
a.insert(map<int, int>::value_type(nums[i], i));
for (int i = 0; i < nums.size(); i++)
{
if (a.count(target - nums[i]) > 0 && (a[target - nums[i]] != i))
{//count函数是判断该数是否在这个哈希表中,若在,返回值大于0
r1 = i;
r2 = a[target - nums[i]];
break;
}
}
return { r1,r2 };
}

};

int main() {
vector<int> twoSum = { 2, 7, 11, 15 };
int n = 9;
vector <int> k;
Solution x;
k = x.twoSum(twoSum, n);
for (int i = 0; i <= 1; i++)
{
cout << k[i];
}
return 0;
}

1.map是STL的一个关联容器,它提供一对一的hash。具体用法,可以看看这https://blog.csdn.net/sevenjoin/article/details/81943864
2.文中有关迭代器的知识自寻

3.一遍哈希表

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
int r1, r2;

for (int i = 0; i < nums.size(); i++)
{
if (a.count(target - nums[i]) > 0 && (a[target - nums[i]] != i))
{//count函数是判断该数是否在这个哈希表中,若在,返回值大于0
r1 = a[target - nums[i]];
r2 = i;
break;
}
a[nums[i]] = i;
}
return { r1,r2 };
}

};

int main() {
vector<int> twoSum = { 2, 7, 11, 15 };
int n = 9;
vector <int> k;
Solution x;
k = x.twoSum(twoSum, n);
for (int i = 0; i <= 1; i++)
{
cout << k[i];
}
return 0;
}
该方法在使用迭代方法,在两遍哈希表的基础上再次优化

总结

这道题学习算法还在其次,主要是学会了如何使用leetcode,并成功提交了第一题,记录一下进步。