- cours d'enseignement donnés au début de l'article et peuvent être clonés adresses projet Github. (1 « )
projet | teneur |
---|---|
Ce travail appartient | Spring Institute 2020 Computer Software Engineering (Roger Ren Jian) |
Ceci est une exigence de l'emploi | travail de projet individuel |
Mon cours d'enseignement | 006 |
Adresse GitHub du projet | IntersectProj |
Mon objectif pour cette opération est | programme de développement personnel pour améliorer la qualité du programme d'écriture de haute performance |
PSP
- Avant de commencer la mise en œuvre du programme, sous la forme suivante pour enregistrer votre PSP est estimé à consacrer à l'élaboration des différents modules de la durée du programme. (0,5 « )
- Après avoir implémenté votre programme, votre temps sur chaque module du programme effectivement passé dans le tableau ci-dessous dossier PSP. (0,5 « )
- PSP
PSP2.1 | Etapes du processus Logiciels personnels | consommatrice de temps estimé (minutes) | Les chronophages réelles (minutes) |
---|---|---|---|
Planification | plan | ||
- Estimation | - Combien de temps est estimé que la tâche exige | dix | dix |
Développement | développer | ||
- Une analyse | - l'analyse des besoins (y compris l'apprentissage de nouvelles technologies) | 75 | 120 |
- Spec Conception | - Générer des documents de conception | dix | 15 |
- Examen de la conception | - Revue de la conception (et ses collègues ont examiné les documents de conception) | 5 | dix |
- Norme de codage | - spécification de code (pour développer une spécification appropriée pour le développement en cours) | 5 | 2 |
- Conception | - conception spécifique | 30 | 30 |
- codage | - codage spécifique | 60 | 180 |
- Revue de code | - Revue de code | 15 | 60 |
- essai | - test (auto-test, modifier le code, présenter des modifications) | 45 | 240 |
rapports | rapport | ||
- Rapport d'essai | - Rapport d'essai | dix | dix |
- Taille de mesure | - l'effort de calcul | 5 | 5 |
- Postmortem et processus plan d'amélioration | - Avec le recul, et le processus de proposer plan d'amélioration | dix | 15 |
total | 280 | 697 |
- réflexion
- Le temps de codage réel est d'environ trois fois le régime
- Le principal problème est que le premier à écrire la programmation orientée objet avec C ++, ne comprennent pas les différents outils et conseils VS plate-forme, l'ampleur du problème ne sont pas les bonnes décisions.
- Cela a également conduit à l'idée initiale derrière un très gros problème, après avoir changé à plusieurs reprises des idées, de modifier le programme
- Perdu beaucoup de temps, l'efficacité ultime et la justesse du programme sont difficiles à protéger.
idée
idées de résolution de problèmes
- idées de résolution de problèmes décrits. C'est, après avoir commencé à obtenir le titre, comment penser, comment trouver des informations dans le processus. (3 « )
- idées de résolution de problèmes divisés en deux parties
- Procédé de calcul spécifique
- Calculer l'idée optimale
Procédé de calcul spécifique
- Cherchant équation linéaire
- Les points de lignes, de haute mathématique scolaire rappelé, en référence à Bowen après la formule générale en utilisant des équations linéaires $ Ax + By + C = 0 $, et $ O (1) la complexité du temps de l'équation linéaire calculé $
- Calculer l'intersection
- formule de calcul du point d'intersection est également d'être (1) dérivée dans le temps de la complexité $ O $
- Cependant, les nouvelles lignes et calculer l'intersection de la ligne droite au préambule, est fortement influencée par l'étape de la complexité du temps
- Il est facile de penser à une solution violente:
- Chaque nouvelle ligne droite n, le nombre d'intersections est ajouté n-1-N $ (en nombre de lignes parallèles) -N (par l'intersection des lignes) $, tandis que le maintien d'un ensemble parallèle de la pente et l'intersection de la collection existante
- La complexité temporelle de l'algorithme est $ O (n ^ 2) $
- A propos de l'intersection des problèmes de précision
- Essayez une classe personnalisée pour représenter des points
code de conception
- La conception et le processus de mise en œuvre. Y compris la façon de concevoir l'organisation du code, comme celles qui ont plusieurs classes, plusieurs fonctions, comment la relation entre eux, si les fonctions clés doivent dessiner un organigramme? Les tests unitaires est de savoir comment la conception? (4 « )
- Les éléments de base (classe)
- 点 point
- Point Constructor point (x, y)
- relation point à point avec la fonction de maintenance (égale)
- point d'intersection droite appartient fonction de maintenance (add, contient, taille)
- ligne ligne
- Deux constructeur droite ligne (point1, point2)
- L'analyse de la relation entre la fonction linéaire (parallèle, se croisent, égaux)
- collection linéaire Lineset
- L'intersection de l'ensemble Interset
- classe de calcul de score Radio
- Addition, soustraction, ce qui minimise le numérateur et le dénominateur
- 点 point
- Chaque fois qu'une nouvelle ligne est ajoutée organigramme
Amélioration des performances
- L'amélioration de la performance du temps d'enregistrement du programme passé, vous décrivez des idées d'amélioration et de montrer un tableau d'analyse des performances (VS généré automatiquement par un outil d'analyse de la performance de 2019), et vous montrer consommer la fonction de programme maximum. (3 « )
Lors de la programmation, je faisais face à deux problèmes principaux, ces deux questions ont un impact important sur la performance globale
- Vous n'êtes pas familier avec le code C
- Non en profondeur et la compréhension précise des problèmes lorsque l'idée
En particulier, la deuxième question, conduit à la première performance d'exécution grave est faible, éventuellement nécessitant plusieurs codes refactoring,
- fraction à base de radio a été conçu à l'origine, dont certains frappent les plus multiples fonctions des résultats communs dans le programme anormalement bas de performances qui ne fonctionne que 1min lignes droites 500+
- Radio classe dans laquelle la fraction occupée d'environ 50% de l'utilisation du processeur, et d'obtenir le plus grand diviseur commun qui est une fonction de la masse
- Après la référence opération binaire - le plus grand algorithme efficace de diviseur commun pour optimiser, mais l'effet final est médiocre, abandonner l'utilisation de la radio utilisée pour améliorer le flotteur de classe de précision
- Programme a été conçu à l'origine avec traversal, ainsi que la suppression de lignes parallèles, l'intersection de la taille, pour améliorer les performances du programme, mais en fin de compte, lorsque la conception delSet de conception initiale utilisation élevée du processeur
- L'intersection traversant, mais aussi regarder l'ensemble d'intersection de la ligne droite, ce qui provoque l'ensemble de l'efficacité du programme ne peut atteindre 1min600 + ligne droite, donc la suppression de ces deux optimisation
- Réflexion: Les deux méthodes ne peut pas améliorer les performances, mais je ne pas utiliser de meilleures structures de données et algorithmes dans la conception et la préparation du
- Le tableau d'analyse de la performance finale
- Le plus important programme de la consommation est fonction du point d'insertion d'intersection pour traverser la fonction principale de l'opération d'insertion de collecte, il me fait penser que j'essaie de unordered_set plus optimize, mais malheureusement DDL imminente, suivie par la fonction de la consommation est la fonction principale de l'ancien ordre groupe de lignes de traversal, qui doit se réunir dans notre analyse initiale
révision du code
- Code Description. Projet a démontré le code clé et expliquer les idées et les notes explicatives. (3 « )
code description
- Descendante pensée d'utiliser pour illustrer mon code
- main.cpp ligne droite dans l'opération d'établissement d'intersection
- Linéaire traversant ensemble de préambule et l'ajout d'une séquence de queue peut être utilisé une telle liste liée Liste Structure de données
- Intersection ensemble nécessité d'éviter les doubles emplois, mais aussi de trouver une grande vitesse, donc l'utilisation de la structure de données arbre rouge et noir set (peut aussi essayer de structure d'index de hachage unordered_set)
// 直线和交点集合
vector<Line> lineList;
set<Point> interSet;
// 遍历
for (i = 0; i < n; i++) {
input >> c;
if (c == 'L') {
input >> x1 >> y1 >> x2 >> y2;
Line l(x1, y1, x2, y2);
for (auto iter = lineList.begin(); iter != lineList.end(); iter++) {
Line lit = (Line)* iter;
if (lit.isParallel(l)) {
continue;
}
// 交点计算和新增
Point pInter = l.getIntersect(lit);
interSet.insert(pInter);
}
lineList.push_back(l);
}
}
- classe de points et de lignes Graph.h & cpp
- Ce qui pour la commande de point de consigne
operator<
etoperator==
robuste, il est place plus importante
- Ce qui pour la commande de point de consigne
class Point
{
public:
float x;
float y;
Point(float xNew, float yNew);
bool equal(Point p);
float getX();
float getY();
// 重载
bool operator<(const Point& p) const {
if (!EQFLOAT(x, p.x))
return x < p.x;
else
return y < p.y;
}
bool operator==(const Point& p) const {
return EQFLOAT(x, p.x) && EQFLOAT(y, p.y);
}
private:
};
- Paramètres de la ligne, la pente, si elles contiennent un certain point, obtenir l'intersection, sont importants
class Line
{
public:
Line(int x1, int y1, int x2, int y2);
float getA();
float getB();
float getC();
float getslope();
bool isParallel(Line l);
bool containsPoint(Point p);
Point getIntersect(Line l);
bool equal(Line l);
private:
// line: Ax + By + C = 0;
float A;
float B;
float C;
float slope;
};
// 计算直线参数极其斜率
Line::Line(int x1, int y1, int x2, int y2) {
A = (float) y2 - y1;
B = (float) x1 - x2;
C = (float) x2 * y1 - x1 * y2;
if (x1 - x2 == 0) {
slope = FLT_MAX;
}
else {
slope = (float)(y1 - y2) / (x1 - x2);
}
}
- Dans l'arrêt si l'intersection de deux qui se chevauchent sur la nécessité d'introduire un nombre à virgule flottante
#define EQS (1e-8)
#define EQFLOAT(a,b) (fabs((a) - (b)) < EQS)
bool Point::operator==(const Point& p) const {
return EQFLOAT(x, p.x) && EQFLOAT(y, p.y);
}
- Que ce soit la dernière ligne droite pour obtenir l'intersection de la ligne droite parallèle au jugement est la clé
Point Line::getIntersect(Line l) {
float a2 = l.getA();
float b2 = l.getB();
float c2 = l.getC();
float x = (B * c2 - C * b2) / (A * b2 - B * a2);
float y = (C * a2 - A * c2) / (A * b2 - B * a2);
Point p(x, y);
return p;
}
bool Line::containsPoint(Point p) {
float res = A * p.getX() + B * p.getY() + C;
return EQFLOAT(res, 0);
}
Test et débogage
- tests unitaires
- couverture de test fonctionnel des fonctions membres de deux classes Point et ligne
TEST_METHOD(TestMethodPoint1) {
Point p(0.5, 3);
Assert::AreEqual(p.getX()== 0.5, true);
Assert::AreEqual(p.getY()==3, true);
Point m(0.5, -3);
Assert::AreNotEqual(p.equal(m), true);
}
TEST_METHOD(TestMethodLine1) {
Line l1(0, 0, 1, 1);
Line l2(0, 2, 1, 0);
Line l3(0, -45, 45, 0);
Line lr(1, 0, 5, 0);
Line bt(1, 1, 1, 10);
Assert::AreEqual(l2.getA()== -2, true);
Assert::AreEqual(l2.getB()== -1, true);
Assert::AreEqual(l2.getC()==2, true);
Assert::AreEqual(l2.getslope()==-2, true);
// parallel
Assert::AreEqual(l1.isParallel(l3), true);
Assert::AreEqual(lr.isParallel(bt), false);
// containsPoint
Point e(0.5,1);
Point base(0,0);
Assert::AreEqual(l2.containsPoint(e), true);
Assert::AreNotEqual(l1.containsPoint(e), true);
Assert::AreEqual(l1.containsPoint(base), true);
// get intersect
Point inter12((float)2/3,(float)2/3);
Assert::AreEqual(l1.getIntersect(l2).equal(inter12), true);
Point inter3lr(45, 0);
Point inter3tb(1, -44);
Assert::AreEqual(l3.getIntersect(lr).equal(inter3lr), true);
// equal
Assert::AreEqual(l1.equal(l2), false);
}
- aides débogage
- GeoGebra est une interface visuelle à des outils de dessin légers mathématiques sophistiqués, utilisant je l' ai trouvé un programme d'aide bug
- couverture de test de stress
- Dessine les étudiants du code à matrice de points généré au hasard, généré beaucoup de milliers de boîte noire définit la quantité de données à l'aide de tests
- Mais le problème est que la surcharge de données de la boîte noire, une fois à l'incohérence shoot est difficile de trouver le problème.
réflexion de programmation
J'ai presque écrit en dehors du travail pendant deux jours, en raison de la plate-forme et ne sont pas familiers avec C ++, et les articles d'hiver ne sont pas trop de tâches de développement de logiciels, cette fois de l'achèvement des résultats des travaux et point de vue du processus, ne sont pas satisfaisantes. Le génie logiciel ainsi que derrière la charge lourde.
Voici des questions et enregistrer quelques points à améliorer
problème
- Les documents de conception qui doivent être affinés à un grain fin? Quel genre de travail est nécessaire pour compléter le code?
- Lorsque le code écrit pour modifier le document de conception est une chose évitable? Comment éviter
améliorer
- Étant donné que le problème de la capacité de programmation, alors je dois apprendre une variété de méthodes, tout en laissant plus de temps pour la programmation, afin d'assurer la qualité du travail, comme cette mission, un jour à l'avance si nous pouvons commencer à écrire, vous devriez être beaucoup amélioré
- besoin de C pour être plus familier avec la langue, et VS IDE, développé après plus d'assurer l'efficacité