21.1.15
#1.コース:コンピュータ科学基礎(4~5課)
#2.授業内容:全員向けコンピュータ科学(CS 502019)アルゴリズム
検索アルゴリズム:線形(順次検索)vsバイナリ(対分検索)
状況に応じて(ソートに基づいて)どのような効果を考慮しますか?
アルゴリズムシンボル:アルゴリズム実行時間の上限/下限(どれだけよく実現されているか)
Big-Oシンボル(推定値表示):トレンドが同じ場合は、同じ式を使用します.△必ずしも数字で区切らなければならないとは限らない.e.g O(n), Log(n)...
実行時間:速度順にO記号をリストします.(上限)
逆に、運転時間の下限を示す尺度
オメガ:一番いい場合は、回数別にリストします(ラッキーなら一度でもできると仮定します)
p.s端末でcdが効かない場合の確認方法:pwdで位置を確認した後、次の格子に入るとき、次の知らないときはdirで検索し、上のフォルダを直接確認して移動します.リニアサーチ
例1
数字ではなく文字列なら?関数を使用する必要があります.
->新しいtypedef概念を理解する
(辞書に似ています)泡ソート:「無効」
ソートにどれくらいかかりますか?必ず並べ替えますか?
ソートのアルゴリズムを理解する(ソートされていない配列をソートすることを目標とする)
Bubbleソート(サイズ、エッジ、置換、置換...大きな値をまとめてソートするスタイル)には、より長いナビゲーション時間がかかります(数値はソートされていないため、ソートと同時に検索する必要があります).
&(n-1)の二乗形
ソート選択:無効
まず最小の数字を左に移動します(移動位置と配置位置の間の交換方式で並べ替えます)
これはもっと良い方法ですか?(小さいものを選択して並べ替えますか?)
&n(n+1)/2方式;他のものを見る前に、その数が一番小さいかどうかは保証できません.最良の場合でも時間を無駄にします.
ソートアルゴリズムの実行時間:コマンドがあれば時間を短縮できますか?
->バブルソートにも時間がかかります
リターン:自分を呼び出し続けます.
ピラミッドの繰り返し作成(1+1+1+1+1+1...再帰定義) マージソート:優れたアルゴリズム.複数の分野で使用されています.他のソートよりも速いです.
左揃え+右揃え+マージ揃え(同じアルゴリズムを盲目的に繰り返す)
nlog n方式
7 4/5 2/6 3/8 1
4 7 5 2/3 6 1 8
2 4 5 7/1 3 6 8
1 2 3 4/5 6 7 8(終了)
ソートとマージを別々に行います(分割、相互ソート、マージを続行します).
電話帳を切る「登録方法」を考えれば理解できる. メモリ メモリアドレス(16進数、メモリに書かれた進数)
0 1 2 3 4 5 6 7 8 9 A B C D E F
e.g RGB色
soxの数字はすべて16進数です. ポインタ:管理が困難なメモリアドレスの格納とアクセスを容易にする概念(上のポインタではなく正規表現を使用します.これはポインタを使用する概念で、結果は同じです).
共通の16進数アドレスを共有し、必要であればポインタがペアリングの方法を持ってきますが、詳しく理解するのは難しいです.例題であるポストの話がどういう意味なのか、逆に理解しづらい.文字列:文字列は実際にどのようにメモリに格納されますか?
ポインタは最初の字しか知らない.(端末、中間文字を知らない);文字列はありません.
(typedef char*string):文字のアドレスを指し、最後に0を保存して終了を示す.これを書くと文字列がありません.(???!) 文字列比較 ビン1(文字が同じかどうか)
でも住所を比較すると文字列
もしsとtが独立していたら?(deepcopyを思い浮かべます)メモリの割り当てと解放:mallocをメモリから完全に独立させるには、次の手順に従います.
まず上のコードからメモリ漏れが発生します->free メモリ交換、スタック、hip:アプリケーション
メモリを交換するためには、水を2杯交換するようなカップサイズのスペースが必要です.(by swap)
実際に使用するには、メモリの動作原理を理解する必要があります.
スタック>ヒップ>グローバル>マシンコード
しょくぎょう
主(x,y)>交換(a,b,tmp;ここで値交換)>しかし交換から取り出して、それから捨てます...△先に入れて先に出すという概念ではなく、順番に出すという概念です.
最終的にx,yは変わらない.
解決策は次のとおりです.x,yアドレス自体を交換すればいい
主(x,y)>a,bはx,yのアドレス値に関連付けられる(*)ファイルへの書き込み:ユーザーから値を入力して出力するプログラミング
フォーマットで、ユーザーが入力したアドレスを格納して転送します.
(ユーザからファイルを取得して作成するプロセス);Pythonでファイルを処理するのと同じです
ファイルコントロール:ファイルの読み込み
画像ファイルの検索例.../jpeg~(ファイル名)
#2.授業内容:全員向けコンピュータ科学(CS 502019)
検索アルゴリズム:線形(順次検索)vsバイナリ(対分検索)
状況に応じて(ソートに基づいて)どのような効果を考慮しますか?
アルゴリズムシンボル:アルゴリズム実行時間の上限/下限(どれだけよく実現されているか)
実行時間:速度順にO記号をリストします.(上限)
逆に、運転時間の下限を示す尺度
オメガ:一番いい場合は、回数別にリストします(ラッキーなら一度でもできると仮定します)
p.s端末でcdが効かない場合の確認方法:pwdで位置を確認した後、次の格子に入るとき、次の知らないときはdirで検索し、上のフォルダを直接確認して移動します.
例1
#include <cs50.h>
#include <stdio.h>
int main(void){
int numbers[6] = {4, 8, 15, 16, 23, 42};
for (int i = 0; i < 6; i++){
if (numbers[i] == 50){
printf("Found\n");
}
}
printf("Not found\n");
}
Not found // 50이 없으니까.
p.s make: *** No rule to make target 'names'. Stop.
エラーは、ファイル名と私が作成するスペルや位置が異なるためです.大したことはないので、sとかちゃんと減っているかどうか確認したり、pwdをよくしたりします.(ファイル名はname.cで、私がnamesでコンパイルしようとしたのとは違います.本当に敏感な友達です.c言語です.数字ではなく文字列なら?関数を使用する必要があります.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void){
string name[4] = {"EMMA", "RODIGO", "BRIAN", "DAVID"};
for (int i = 0 ; i < 4; i++){
if strcmp(name[i], "EMMA") == 0) {
printf("Found\n");
}
}
printf("Not found\n");
}
電話帳の例2#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void){
string name[4] = {"EMMA", "RODIGO", "BRIAN", "DAVID"};
string number[4] = {"617-555-0100", "617-555-0103", "617-555-0102","617-555-0104"};
for (int i =0 ; i < 4 ; i++){
if (strcmp(name[i], "EMMA") == 0){
printf("%s\n", number[i]);
return 0;
}
}
printf("Not Found\n");
return 1;
}
しかし、ここでは、電話帳と人名はいつも一致していますか?->新しいtypedef概念を理解する
(辞書に似ています)
#include <cs50.h>
#include <stdio.h>
#include <string.h>
typedef struct{
string name;
string number;
}
person;
int main(void){
person people[4];
people[0].name = "EMMA";
people[0].number = "617-555-0100";
people[1].name = "RODIGO";
people[1].number = "617-555-0103";
people[2].name = "BRIAN";
people[2].number = "617-555-0102";
people[3].name = "DAVID";
people[3].number = "617-555-0104";
for (int i =0 ; i < 4 ; i++){
if (strcmp(people[i].name, "EMMA") == 0){
printf("%s\n", people[i].number);
return 0;
}
}
printf("Not Found\n");
return 1;
}
上で使用したstruct:複数のデータ型を含むコンテナだと思います.前に学んだ内容の応用概念を総合することができる.ソートにどれくらいかかりますか?必ず並べ替えますか?
ソートのアルゴリズムを理解する(ソートされていない配列をソートすることを目標とする)
Bubbleソート(サイズ、エッジ、置換、置換...大きな値をまとめてソートするスタイル)には、より長いナビゲーション時間がかかります(数値はソートされていないため、ソートと同時に検索する必要があります).
&(n-1)の二乗形
ソート選択:無効
まず最小の数字を左に移動します(移動位置と配置位置の間の交換方式で並べ替えます)
これはもっと良い方法ですか?(小さいものを選択して並べ替えますか?)
&n(n+1)/2方式;他のものを見る前に、その数が一番小さいかどうかは保証できません.最良の場合でも時間を無駄にします.
ソートアルゴリズムの実行時間:コマンドがあれば時間を短縮できますか?
->バブルソートにも時間がかかります
ピラミッドの繰り返し作成(1+1+1+1+1+1...再帰定義)
# include <cs50.h>
# include <stdio.h>
void draw(int h);
int main(void){
int height = get_int("Height: ");
draw(height);
}
void draw(int h){
for (int i = 1; i<= h; i++){
for (int j = 1; j <= i ; j++){
printf("#");
}
printf("\n");
}
}
Height: 5
#
##
###
####
#####
2つのループを再帰的に変換すると、次のように変更されます.(より小さな関数の値で再描画する概念を理解しておくだけです.)# include <cs50.h>
# include <stdio.h>
void draw(int h);
int main(void){
int height = get_int("Height: ");
draw(height);
}
void draw(int h){
if (h==0){ // 음수가 되지 않게 막아줌
return;
}
draw(h-1); // 재귀되는 부분
for (int i = 0; i < h ; i++){
printf("#");
}
printf("\n");
}
左揃え+右揃え+マージ揃え(同じアルゴリズムを盲目的に繰り返す)
nlog n方式
7 4/5 2/6 3/8 1
4 7 5 2/3 6 1 8
2 4 5 7/1 3 6 8
1 2 3 4/5 6 7 8(終了)
ソートとマージを別々に行います(分割、相互ソート、マージを続行します).
電話帳を切る「登録方法」を考えれば理解できる.
0 1 2 3 4 5 6 7 8 9 A B C D E F
e.g RGB色
soxの数字はすべて16進数です.
#include <stdio.h>
int main(void){
int n =50;
printf("%p\n", &n);
}
0x7fff808841ac // 실제 n값의 메모리 상 위치 확인하는 것, 주소
コマンド: printf("%i\n", *&n);
// 프린트는 50 그대로 나오지만 그 주소로 가긴 감.(사용자가 볼 수는 없음)
#include <stdio.h>
int main(void){
int n =50;
int *p = &n;
printf("%p\n", p); // 포인터 사용.(별모양)
}
0x7ffe838e24bc //보안상 계속 바뀐다고 함. 여하튼 주소를 바로 보여줌.
그냥 50을 바로 표현하려면?
#include <stdio.h>
int main(void){
int n =50;
int *p = &n;
printf("%i\n", *p);
}
理解の概念:n=50はどんなアドレスがあって、pもどんなアドレスがあります.しかし、nのアドレスはpのアドレスと同じで、nのみを表し、pもメモリに格納され、互いに矢印で接続されている. 共通の16進数アドレスを共有し、必要であればポインタがペアリングの方法を持ってきますが、詳しく理解するのは難しいです.例題であるポストの話がどういう意味なのか、逆に理解しづらい.
ポインタは最初の字しか知らない.(端末、中間文字を知らない);文字列はありません.
(typedef char*string):文字のアドレスを指し、最後に0を保存して終了を示す.これを書くと文字列がありません.(???!)
#include <stdio.h>
int main(void){
char *s = "EMMA";
printf("%s\n", s);
}
// include<cs 50> 쓴 것과 유사
//printf("%p\n", s); 하면 string의 주소를 확인할 수 있다.
0x42adba(첫번째 열의 주소. 굳이 인덱싱 안 해도 이 주소가 맞음)
// 그 외 주소는 인덱싱하면 번호가 하나씩 이동하는 것을 알 수 있음.
#include <stdio.h>
int main(void){
char *s = "EMMA";
printf("%c\n", *s);
}
앞에 한 글자만(E)
// 여기에 s+1, 2... 하면 인덱싱이 됨.
#include <cs50.h>
#include <stdio.h>
int main(void){
int i = get_int("i: ");
int j = get_int("j: ");
if (i == j){
printf("Same\n");
}else{
printf("Different\n");
}
}
ビン2(文字が同じかどうか)#include <cs50.h>
#include <stdio.h>
int main(void){
string s = get_string("s: ");
string t = get_string("t: ");
if (s == t){
printf("Same\n");
}else{
printf("Different\n");
}
}
厳密には、2つのアドレスを比較すべきですが、現在は文字列を比較しているだけです.でも住所を比較すると
#include <stdio.h>
#include <cs50.h>
int main(void){
char *s = get_string("s: ");
char *t = get_string("t: ");
if (s == t){
printf("Same\n");
}else{
printf("Different\n");
}
}
$ ./compare
s: 2
t: 2
Different
コピー#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
int main(void){
string s = get_string("s: ");
string t = s; // 복사
t[0] = toupper(t[0]);
printf("%s\n", s);
printf("%s\n", t);
}
s: emma
Emma
Emma
システムはs,tを逐字コピーし,結果値も同じになる.(tはsに割り当てられた同じ運動の体である)もしsとtが独立していたら?(deepcopyを思い浮かべます)
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char *s = get_string("s: ");
char *t = malloc(strlen(s)+1);
for (int i = 0, n = strlen(s) ; i < n + 1; i++){
t[i] = s[i];
}
t[0] = toupper(t[0]);
printf("%s\n", s);
printf("%s\n", t);
}
まず上のコードからメモリ漏れが発生します->free
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char *s = get_string("s: ");
char *t = malloc(strlen(s)+1);
strcpy(t, s);
t[0] = toupper(t[0]);
printf("%s\n", s);
printf("%s\n", t);
free(t); //메모리 누수를 해제시켜줌 : 오버플로우를 막아주는 역할한다고 함.
}
メモリを交換するためには、水を2杯交換するようなカップサイズのスペースが必要です.(by swap)
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
可能に見えますが、実際にはできません(元のバージョンではなく、コピーが交換されており、実際の例としては使用できません).実際に使用するには、メモリの動作原理を理解する必要があります.
スタック>ヒップ>グローバル>マシンコード
しょくぎょう
主(x,y)>交換(a,b,tmp;ここで値交換)>しかし交換から取り出して、それから捨てます...△先に入れて先に出すという概念ではなく、順番に出すという概念です.
最終的にx,yは変わらない.
解決策は次のとおりです.x,yアドレス自体を交換すればいい
主(x,y)>a,bはx,yのアドレス値に関連付けられる(*)
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
#include <stdio.h>
int main(void){
char s[5];
printf("s : ");
scanf("%s", s);
printf("s: %s\n", s);
}
文字列は、設定された容量に基づいて保存されます(そのうち5つしかありません).容量を任意に増やすために、他のコードを使用すると、NULL処理を認識して行うことができない場合があります.△これは完全に理解された概念ではない.(ユーザからファイルを取得して作成するプロセス);Pythonでファイルを処理するのと同じです
ファイルコントロール:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void){
FILE *file = fopen("phonebook.csv", "a");
char *name = get_string("Name: ");
char *number = get_string("Number: ");
fprintf(file, "%s, %s\n", name, number);
fclose(file);
}
// .csv 내에 사용자가 입력한 내용이 적힘
画像ファイルの検索例.../jpeg~(ファイル名)
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
if (argc != 2){
return 1;
}
FILE *file = fopen(argv[1], "r");
if (file == NULL){
return 1;
}
unsigned char bytes[3];
fread(bytes, 3, 1, file);
if (bytes[0] == 0xff && bytes[1]== 0xd8 && bytes[2] == 0xff){
printf("Maybe\n");
}else{
printf("No\n");
}
}
このとき、写真ファイルもバイナリで検索されます.Reference
この問題について(21.1.15), 我々は、より多くの情報をここで見つけました https://velog.io/@sinichy7/21.1.15-68hvtf7tテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol