1.大数据处理
使用多个文件分割。
int main()
{
// 打开存储数据的原始文件
FILE *pf = fopen("data.dat", "rb");
if (pf == nullptr)
return 0;
// 这里由于原始数据量缩小,所以这里文件划分的个数也变小了,11个小文件
const int FILE_NO = 11;
FILE *pfile[FILE_NO] = { nullptr };
for (int i = 0; i < FILE_NO; ++i)
{
char filename[20];
sprintf(filename, "data%d.dat", i+1);
pfile[i] = fopen(filename, "wb+");
}
// 哈希映射,把大文件中的数据,映射到各个小文件当中
int data;
while (fread(&data, 4, 1, pf) > 0)
{
int findex = data % FILE_NO;
fwrite(&data, 4, 1, pfile[findex]);
}
// 因为结果要记录数字和重复的次数,所以需要打包一个类类型
struct Node
{
Node(int v, int c) :val(v), count(c) {}
// 为什么要实现operator>,因为小根堆里面要比较Node对象的大小
bool operator>(const Node &src)const
{
return count > src.count;
}
int val; // 表示数字的值
int count; // 表示数字重复的次数
};
// 定义一个链式哈希表
unordered_map<int, int> numMap;
// 先定义一个小根堆
priority_queue<Node, vector<Node>, greater<Node>> minheap;
// 分段求解小文件的top 10大的数字,并求出最终结果
for (int i = 0; i < FILE_NO; ++i)
{
// 恢复小文件的文件指针到起始位置
fseek(pfile[i], 0, SEEK_SET);
while (fread(&data, 4, 1, pfile[i]) > 0)
{
numMap[data]++;
}
int k = 0;
auto it = numMap.begin();
// 如果堆是空的,先往堆方10个数据
if (minheap.empty())
{
// 先从map表中读10个数据到小根堆中,建立top 10的小根堆,最小的元素在堆顶
for (; it != numMap.end() && k < 10; ++it, ++k)
{
minheap.push(Node(it->first, it->second));
}
}
// 把K+1到末尾的元素进行遍历,和堆顶元素比较
for (; it != numMap.end(); ++it)
{
// 如果map表中当前元素重复次数大于,堆顶元素的重复次数,则替换
if (it->second > minheap.top().count)
{
minheap.pop();
minheap.push(Node(it->first, it->second));
}
}
// 清空哈希表,进行下一个小文件的数据统计
numMap.clear();
}
// 堆中剩下的就是重复次数最大的前k个
while (!minheap.empty())
{
Node node = minheap.top();
cout << node.val << " : " << node.count << endl;
minheap.pop();
}
// a和b两个文件,各有50亿个URL/IP,IP四个字节 内存限制400M
return 0;
}
2.git知识分享 实践 git 10个常用命令
//git init => .git文件夹(干什么用的!)
git add
git commit
git push
git pull
git status
git reset
git branch
git checkout
gi clone
2.1问题一: git和git hub关系是啥?
GIT是分布式版本控制系统(DVCS)的一个例子,它通常用于开源和商业软件开发。DVCS允许完全访问项目的每个文件、分支和迭代,并允许每个用户访问所有更改的完整和独立的历史记录。与曾经流行的集中式版本控制系统不同,像Git这样的DVCS不需要与中央存储库保持恒定的连接。开发人员可以在任何地方工作并从任何时区异步协作。
如果没有版本控制,团队成员就会受到冗余任务、较慢的时间表和单个项目的多个副本的影响。为了消除不必要的工作,Git和其他VCS为每个贡献者提供了一个统一和一致的项目视图,并对已经在进行的工作进行了表面处理。看到透明的变更历史,是谁做出的,以及他们如何为项目的开发做出贡献,有助于团队成员在独立工作的同时保持一致。
仓库是什么?
A 储存库,或GIT项目,包含与项目关联的文件和文件夹的整个集合,以及每个文件的修订历史记录。文件历史记录在时间上显示为快照,名为犯,并且提交以链接列表关系的形式存在,并且可以组织成多个开发行,称为枝条。因为Git是一个DVCS,所以存储库是独立的单元,任何拥有存储库副本的人都可以访问整个代码库及其历史记录。使用命令行或其他易于使用的接口,git存储库还允许:与历史交互、克隆、创建分支、提交、合并、比较不同版本代码的更改等等。
在存储库中工作可以使开发项目得到组织和保护。我们鼓励开发人员修复bug,或者创建新的特性,而不必担心主线开发工作会受到影响。GIT通过使用主题分支来促进这一点:在历史中使用轻量级指针来提交,在不再需要时,可以很容易地创建和放弃这些指针。
通过GitHub这样的平台,Git还为项目的透明性和协作提供了更多的机会。公共存储库帮助团队共同构建最好的最终产品。
基本Git命令
要使用Git,开发人员使用特定的命令来复制、创建、更改和组合代码。这些命令可以直接从命令行执行,也可以使用以下应用程序执行GitHub桌面或者吉特·克拉肯。下面是使用Git的一些常用命令:
git init初始化全新的Git存储库,并开始跟踪现有目录。它在现有目录中添加一个隐藏的子文件夹,其中包含版本控制所需的内部数据结构。
git clone创建已远程存在的项目的本地副本。克隆包括项目的所有文件、历史记录和分支。
git add改变的阶段。GIT跟踪开发人员代码库的更改,但是有必要对这些更改进行阶段和快照,以便将它们包含在项目的历史记录中。此命令执行暂存,这是该两步进程的第一部分。所进行的任何更改都将成为下一次快照的一部分,也是项目历史的一部分。分阶段和单独提交让开发人员完全控制他们的项目历史,而不改变他们的代码和工作方式。
git commit将快照保存到项目历史记录并完成更改跟踪过程。简而言之,提交功能就像拍照一样。任何曾经上演过的git add将成为快照的一部分git commit.
git status显示未跟踪、修改或阶段性更改的状态。
git branch显示正在本地工作的分支。
git merge将发展线合并在一起。此命令通常用于组合在两个不同分支上所做的更改。例如,当开发人员希望将功能分支的更改合并到主分支以进行部署时,他们将进行合并。
git pull使用远程对应的更新本地开发行。如果队友对远程上的分支进行了提交,开发人员将使用此命令,并且他们希望在本地环境中反映这些更改。
git push使用本地提交到分支的任何提交更新远程存储库。
从Git命令的完整参考指南.
探索更多的Git命令
有关Git实践的详细内容,下面的视频展示了如何最大限度地利用一些Git命令。
在当地工作
git status
两步提交
git pull和git push
GitHub如何适应
GitHub是一个Git托管存储库,它为开发人员提供工具,通过命令行特性、问题(线程讨论)、拉请求、代码评审或使用GitHub Marketplace中的免费采购应用程序集合来提供更好的代码。有了像GitHub Flow这样的协作层,一个由1500万开发人员组成的社区,以及一个拥有数百个集成的生态系统,GitHub改变了软件的构建方式。
GitHub是如何工作的
GitHub将协作直接构建到开发过程中。工作被组织成存储库,开发人员可以在其中概述需求或方向,并为团队成员设定期望。然后,使用GitHub流,开发人员只需创建一个分支来处理更新,提交更改以保存它们,打开拉请求以提议和讨论更改,并在每个人都在同一页面上时合并拉请求。
集流
GitHub流是一个轻量级的、基于分支的工作流,基于核心Git命令构建于全球各地的团队-包括我们的团队。
GitHub流有六个步骤,每个步骤在执行时都有明显的好处:
创建一个分支:从规范部署分支创建的主题分支(通常是master)允许团队为许多平行的努力作出贡献。短命的主题分支,特别是保持团队的专注,并导致快速船.
添加提交:分支中的开发工作快照会在项目历史记录中创建安全、可逆转的点。
打开拉请求:拉请求宣传一个项目正在进行的努力,并为一个透明的开发过程定下基调。
讨论和审查代码:团队通过注释、测试和检查打开的拉请求来参与代码评审。守则审查是开放和参与性文化的核心。
合并:单击Merge后,GitHub将自动执行相当于本地“gitMerge”操作的操作。GitHub还将整个分支开发历史记录保存在合并的拉请求上。
部署:团队可以选择最佳的发布周期或集成持续集成工具,并且可以保证部署分支上的代码已经通过了健壮的工作流。
了解更多关于GitHub流的信息
开发人员可以在下面提供的资源中找到有关GitHub流的更多信息。
交互式指南
GitHub流视频
GitHub和命令行
对于新加入命令行的开发人员,GitHub培训小组已经将一系列的教程在Git命令上指引方向。有时,一系列命令可以绘制如何使用Git的图片:
GitHub是一个用于版本控制和协作的代码托管平台。它让你和其他人在任何地方的项目上一起工作。
本教程将向您介绍GitHub的基本要素,如储存库, 枝条, 犯,和拉请求。您将创建自己的HelloWorld存储库,并学习GitHub的拉请求工作流,这是一种创建和检查代码的流行方法。
第一步。创建一个仓库
A 储存库通常用于组织单个项目。存储库可以包含文件夹和文件、图像、视频、电子表格和数据集-任何项目需要的内容。我们建议包括自述,或者包含项目信息的文件。在创建新存储库的同时,GitHub可以轻松地添加一个。它还提供其他常见选项,如许可证文件。
你的hello-world存储库可以是您存储想法、资源,甚至与他人共享和讨论事物的地方。
创建新存储库
在右上角,在您的化身或同一性旁边,单击然后选择新储存库.
命名存储库hello-world.
写一个简短的描述。
选择使用自述文件初始化此存储库.
new-repo-form
点击创建存储库.
第二步。创建分支机构
分枝是一次处理不同版本存储库的方法。
默认情况下,存储库有一个名为master被认为是权威的分支。在提交之前,我们使用分支进行实验和编辑。master.
创建分支时,master分支,您正在复制或快照master就像那时一样。如果其他人对master分支,当您正在处理您的分支时,您可以插入这些更新。
下图显示:
这个master支部
一个新的分支叫做feature(因为我们正在做这个分支的“特写工作”)
那个旅程feature在它被合并到master
a branch
您曾经保存过不同版本的文件吗?类似于:
story.txt
story-joe-edit.txt
story-joe-edit-reviewed.txt
分支在GitHub存储库中实现了类似的目标。
在GitHub,我们的开发人员、作者和设计人员使用分支将bug修复和特性工作与我们的master(生产)分公司。当更改准备就绪时,它们将分支合并为master.
创建一个新分支
转到您的新存储库hello-world.
单击文件列表顶部的下拉列表,显示支部:师父.
键入分支名称,readme-edits,转到新的分支文本框中。
选择蓝色创建分支在键盘上输入框或按下“Enter”键。
branch gif
现在你有两个分支,master和readme-edits。他们看起来完全一样,但不会太久!接下来,我们将更改添加到新的分支中。
第三步。进行并提交更改
太棒了!现在,您在代码视图中readme-edits分支,它是master。我们来做些编辑吧。
在GitHub上,保存的更改称为犯。每个提交都有一个关联提交消息,这是一种描述,解释了为什么做出了特定的更改。提交消息捕获了您更改的历史,以便其他贡献者能够了解您所做的事情以及原因。
进行并提交更改
单击README.md档案。
单击在文件视图右上角的铅笔图标进行编辑。
在编辑中,写一些关于你自己的事情。
编写一条描述更改的提交消息。
点击提交更改纽扣。
commit
这些更改将只对您的readme-edits分支,所以现在这个分支包含的内容与master.
第四步。打开拉请求
编辑得不错!现在,您已经更改了master,您可以打开一个拉请求.
拉请求是GitHub协作的核心。当你打开一个拉请求,您正在提议您的更改,并要求有人审查并收回您的贡献,并将它们合并到他们的分支中。拉请求显示差异,或来自两个分支的内容的差异。更改、加法和减法以绿色和红色显示。
一旦提交,就可以打开拉请求并开始讨论,甚至在代码完成之前。
通过使用GitHub的@提及系统在你的拉请求信息中,你可以向特定的人或团队征求反馈,不管他们是在大厅下面,还是在10个时区之外。
您甚至可以在自己的存储库中打开拉请求并自己合并它们。在进行大型项目之前,这是了解GitHub流的一个很好的方法。
打开对自述文件更改的拉请求
单击图像以获得更大的版本
步进 截图
单击 拉请求选项卡,然后从“拉请求”页面中单击“绿色”。新拉请求纽扣。 pr-tab
在实例比较框中,选择您创建的分支,readme-edits,与.进行比较master(原件)。 branch
查看您在比较页面上的差异,确保它们是您想要提交的。 diff
当您满意这些是您想提交的更改时,单击大绿色创建拉请求纽扣。 create-pull
给你的拉请求一个标题,并写一个简短的描述你的变化。 pr-form
当您完成您的信息,单击创建拉请求!
针尖:你可以用表情符号和拖放图像和gifs在评论和拉请求上。
第五步。合并您的拉请求
在最后一步中,是时候将您的更改结合在一起了-将您的readme-edits枝入master分支。
单击绿色合并拉请求按钮将更改合并为master.
点击确认合并.
继续删除分支,因为它的更改已被合并,而删除分支紫色盒子里的按钮。
merge delete
庆祝一下!
通过完成本教程,您已经学会了在GitHub上创建一个项目并发出拉请求!
下面是您在本教程中完成的工作:
创建了一个开放源码存储库
启动并管理一个新分支
更改文件并将这些更改提交给GitHub
打开并合并一个拉请求
看看你的GitHub简介,你会看到你的新的贡献平方!
要了解更多关于拉请求的功能,我们建议阅读集线器导流器。你也可以访问GitHub探索并参与开源项目。
针尖:看看我们的另一个导轨, YouTube频道和按需培训有关如何开始使用GitHub的更多信息。
良好的文档是任何项目成功的关键。使文档可访问,使人们能够了解项目;使其易于更新,确保文档保持相关性。
记录项目的两种常见方法是自述文件和维基:
自述文件是其他用户了解更多关于您的工作的一种快速而简单的方法。
GitHub上的wiki帮助您以一种有用的方式提供有关项目的深入信息。
至少在你的项目上有一个自述文件是个好主意,因为这是很多人第一次找到你的工作时会读到的东西。
创建自述文件
当你创建一个新的存储库尽管GitHub,选择“使用自述文件初始化此存储库”,除非您计划导入现有的存储库。Screenshot of initializing a README
您的README.md文件现在可以在全新的存储库中进行编辑。您的项目名称位于顶部,然后是您在创建存储库时选择包含的任何描述。README很容易修改,两者都很容易修改。论GitHub或者是本地的。检查一下掌握马尔可夫指南若要了解更多有关如何在创建文件后修改文件中的文本的信息,请执行以下操作。
格式化自述文件
README通常遵循一种格式,以便立即引导开发人员了解项目中最重要的方面。
项目名称:您的项目名称是人们在滚动到您的自述文件时会看到的第一件事,并且是在创建自述文件时包含的。
描述*对您的项目的描述如下。一个好的描述是清晰的,简短的,而且是切中要害的。描述您的项目的重要性,以及它的作用。
目录可选地,包括一个目录,以便其他人能够快速浏览,特别是冗长或详细的自述海洋生态系统。
安装安装是有效自述文件中的下一节。告诉其他用户如何在本地安装项目。另外,还可以包括一个gif,以使其他人的过程更加清晰。
使用下一节是“使用”,在该部分中,您将指导其他人在安装项目后如何使用项目。这也是一个很好的地方,包括截图的项目在行动。
贡献较大的项目往往有关于对其项目作出贡献的章节,其中概述了捐助指示。有时,这是一个单独的文件。如果您有特定的贡献偏好,请解释它们,以便其他开发人员知道如何为您的工作做出最佳贡献。要了解更多关于如何帮助他人做出贡献的信息,请参阅指南为存储库贡献者设置指南.
学分:包括一个信贷部分,以突出显示和链接到您的项目的作者。
许可证最后,包括项目许可证的一个部分。有关选择许可的更多信息,请查看GitHub的许可证指南!
您的自述应该只包含开发人员开始使用和为您的项目做出贡献所需的信息。下面概述的更长的文档最适合wiki。
创建您的wiki
GitHub上的每个存储库都带有一个wiki。在创建了存储库之后,可以通过侧栏导航设置包含的wiki。启动wiki只需单击wiki按钮并创建您的第一页。
Screenshot of the starting page
添加内容
Wiki内容被设计成易于编辑。您可以在任何wiki页面上添加或更改内容,方法是单击编辑按钮位于页的右上角。这就打开了维基编辑器。
Screenshot of the wiki editor
支持的任何格式都可以编写Wiki页面。GitHub标记。使用编辑器中的下拉菜单,您可以选择wiki的格式,然后使用wiki工具栏在页面上创建和包含内容。wiki还允许您选择包含自定义页脚,您可以在其中列出项目的联系人详细信息或许可信息。
GitHub跟踪对wiki中每个页面所做的更改。在页面标题下面,除了对页面进行提交的次数之外,还可以看到谁做了最新的编辑。单击此信息将带您进入完整的页面历史记录,在那里您可以比较修订或看到经过一段时间的编辑的详细列表。
添加页面
您可以通过选择新页在右上角。默认情况下,您创建的每个页面都会自动包含在wiki的侧栏中,并按字母顺序列出。
Screenshot of the wiki sidebar
您还可以通过单击添加自定义侧栏链接。自定义侧栏内容可以包括文本、图像和链接。
注意:名为“Home”的页面作为您的wiki的入口页面。如果缺少,则会显示一个自动生成的目录。
如果您熟悉命令行,也可以在本地修改wiki。检查我们的帮助文章想了解更多信息。
语法高亮
Wiki页面通过使用以下语法支持多种语言代码的自动语法高亮显示:
def foo
puts 'bar'
end
块必须以三个背板开始,可选地后面跟着块包含的语言的名称。看见语言清单可以突出显示语法。
块内容应该缩进与开口背面相同的水平。块的结尾必须有三个背板缩进与开口背板相同的水平。
你完了!
您已经了解了一些关于如何与GitHub社区的其他成员最好地共享您的工作的重要信息,您的项目的范围是否足以容纳自己的wiki,还是您刚刚开始并建立一个清晰而简洁的自述文件。
若要阅读有关本文所述主题的更多内容,请参阅创建新存储库, 编辑存储库中的文件, 为存储库贡献者设置指南和选择许可证是个很好的起点。否则,看看其他的GitHub指南继续学习。
最后,如果您对为项目构建文档站点感兴趣,我们建议使用GitHub页面.
2.2问题二: git提交代码的命令 工作区 暂存区 本地仓库 远程仓库
2.3问题三: 怎么创建远程分支,怎么创建本地分支, 分支如何提交代码,分支切换
3.大数加减
#include "pch.h"
#include <iostream>
#include <algorithm> // sort find find_if
#include <string>
#include <vector>
using namespace std;
// 大整数类型
class BigInt
{
public:
BigInt(string str) :strDigit(str) {}
private:
string strDigit; // 使用字符串存储大整数
friend ostream& operator<<(ostream &out, const BigInt &src);
friend BigInt operator+(const BigInt &lhs, const BigInt &rhs);
friend BigInt operator-(const BigInt &lhs, const BigInt &rhs);
};
// 打印函数
ostream& operator<<(ostream &out, const BigInt &src)
{
out << src.strDigit;
return out;
}
// 大数加法
BigInt operator+(const BigInt &lhs, const BigInt &rhs)
{
/*
遍历字符串l,r,从后往前遍历
同位置的数字相加, 进位 flag 存入一个结果当中 string result
同时完成
某个字符串先完成 都要考虑进位
*/
string result;
bool flag = false;
int size1 = lhs.strDigit.length() - 1;
int size2 = rhs.strDigit.length() - 1;
int i = size1, j = size2;
for (; i >= 0 && j >= 0; --i, --j)
{
int ret = lhs.strDigit[i] - '0' + rhs.strDigit[j] - '0';
if (flag)
{
ret += 1;
flag = false;
}
if (ret >= 10)
{
ret %= 10;
flag = true;
}
result.push_back(ret + '0');
}
// i j
if (i >= 0)
{
while (i >= 0)
{
int ret = lhs.strDigit[i] - '0';
if (flag)
{
ret += 1;
flag = false;
}
if (ret >= 10)
{
ret %= 10;
flag = true;
}
result.push_back(ret + '0');
i--;
}
}
else if (j >= 0)
{
while (j >= 0)
{
int ret = rhs.strDigit[j] - '0';
if (flag)
{
ret += 1;
flag = false;
}
if (ret >= 10)
{
ret %= 10;
flag = true;
}
result.push_back(ret + '0');
j--;
}
}
if (flag)
{
result.push_back('1');
}
reverse(result.begin(), result.end());
return result; // return BigInt(result);
}
// 大数减法
BigInt operator-(const BigInt &lhs, const BigInt &rhs)
{
/*
找大的字符串左减数,小的左被减数
遍历两个字符串,减法,借位(bool flag), string result 存下来
*/
string result;
bool flag = false;
bool minor = false;
string maxStr = lhs.strDigit;
string minStr = rhs.strDigit;
if (maxStr.length() < minStr.length())
{
maxStr = rhs.strDigit;
minStr = lhs.strDigit;
minor = true;
}
else if (maxStr.length() == minStr.length())
{
if (maxStr < minStr)
{
maxStr = rhs.strDigit;
minStr = lhs.strDigit;
minor = true;
}
else if (maxStr == minStr)
{
return string("0");
}
}
else
{
;
}
int size1 = maxStr.length() - 1;
int size2 = minStr.length() - 1;
int i = size1, j = size2;
for (; i >= 0 && j >= 0; --i, --j)
{
int ret = maxStr[i] - minStr[j];
if (flag)
{
ret -= 1;
flag = false;
}
if (ret < 0)
{
ret += 10;
flag = true;
}
result.push_back(ret + '0');
}
while (i >= 0)
{
int ret = maxStr[i]-'0';
if (flag)
{
ret -= 1;
flag = false;
}
if (ret < 0)
{
ret += 10;
flag = true;
}
result.push_back(ret + '0');
i--;
}
if (minor)
{
result.push_back('-');
}
reverse(result.begin(), result.end());
return result;
}
int main()
{
BigInt int1("9785645649886874535428765");
BigInt int2("28937697857832167849697653231243");
BigInt int3("9785645649886874535428765");
//28937707643477817736572188660008
//28937707643477817736572188660008
cout << int1 + int2 << endl;
//28937688072186517962823117802478
//28937688072186517962823117802478
cout << int1 - int2 << endl;
return 0;
}